メソッドが、模擬オブジェクトによって返された複数の他のコンテナの集合であるコレクションをカプセル化するコンテナを返すかどうかをチェックする方法を知りたいと思います。つまり、個々のコンテナのすべての要素が含まれています。私はいくつかのテストをコンテナの 'works'(add/addAll/etcなど)をチェックしているので、そのことは分かっていますが、 'createsRoadUsersAccordingToAllAddedCreators'の下のテストではどうなっているのか分かりません。コレクションをカプセル化したオブジェクトを模倣する
私は、作成したRoadUserCreationDaemonクラスを追加しました。このクラスは、追加されたRoadUserCreatorに基づいてRoadUserContainerを返します。単純化されたバージョン:
public class RoadUserCreationDaemon {
private SimulationManager simulationManager;
private List<RoadUserCreator> roadUserCreators;
public RoadUserCreationDaemon(SimulationManager simulationManager) {
this.simulationManager = simulationManager;
roadUserCreators = new ArrayList<RoadUserCreator>();
}
public void addRoadUserCreator(RoadUserCreator roadUserCreator) {
roadUserCreators.add(roadUserCreator);
}
public RoadUserContainer createRoadUsers() {
RoadUserContainer roadUsers = new RoadUserContainerImpl();
for (RoadUserCreator creator : roadUserCreators) {
roadUsers.addAll(createRoadUsers(creator));
}
return roadUsers;
}
public RoadUserContainer createRoadUsers(
RoadUserCreator roadUserCreator) {
return roadUserCreator.create();
}
}
私は供給クリエイターとRoadUserContainerを返しcreateRoadUsersためのテストを(JUnit4/JMock2.5.1)書き込むことによって開始しました。私はないんだけど...コメントが言うように
@RunWith(JMock.class)
public class TestRoadUserCreationDaemon {
Mockery context = new JUnit4Mockery();
private RoadUserCreationDaemon daemon;
private RoadUserCreator roadUserCreator;
private SimulationManager simulationManager;
private RoadUserContainer createdRoadUsers;
@Before
public void setUp() {
simulationManager = context.mock(SimulationManager.class);
daemon = new RoadUserCreationDaemon(simulationManager);
roadUserCreator = context.mock(RoadUserCreator.class);
createdRoadUsers = context.mock(RoadUserContainer.class);
}
@Test
public void createsRoadUsersAccordingToAllAddedCreators() throws Exception {
final RoadUserCreator anotherRoadUserCreator = context.mock(RoadUserCreator.class, "anotherRUC");
final RoadUserContainer moreCreatedRoadUsers = context.mock(RoadUserContainer.class, "moreCRU");
context.checking(new Expectations() {{
oneOf (roadUserCreator).create(); will(returnValue(createdRoadUsers));
oneOf (anotherRoadUserCreator).create(); will(returnValue(moreCreatedRoadUsers));
oneOf (createdRoadUsers).roadUsersAsList();
oneOf (moreCreatedRoadUsers).roadUsersAsList();
}});
daemon.addRoadUserCreator(roadUserCreator);
daemon.addRoadUserCreator(anotherRoadUserCreator);
daemon.createRoadUsers();
//how to easily check that the two lists are equivilant - have same items, but not the same object?
//assertEquals(createdRoadUsers, daemon.createRoadUsers());
}
@Test
public void createsRoadUsersAccordingToCreator() throws Exception {
context.checking(new Expectations() {{
oneOf (roadUserCreator).create(); will(returnValue(createdRoadUsers));
}});
assertEquals(createdRoadUsers, daemon.createRoadUsers(roadUserCreator));
}
}
:その後、私はそれはクリエイターによって返された個々のコンテナのすべての要素の入った容器を返すかどうかを確認するために、非パラメータ化createRoadUsersのためのテストを書き始めどのように非醜い方法で進むことを確認してください。
「RoadUserContainer」インターフェース:
public interface RoadUserContainer extends Iterable<RoadUser> {
public void add(RoadUser roadUser);
public Iterator<RoadUser> iterator();
public void addAll(RoadUserContainer createRoadUsers);
public List<RoadUser> roadUsersAsList();
public boolean equals(RoadUserContainer otherContainer);
...
}
私はTDDとモックに新しいですし、これは> 6年間の私の最初のJavaプロジェクトであるので、補助的な美学にコメントして自由に感じます!
あなたの基準実際のコンテナを作成するのは問題ありません。なぜなら、コンテナは「値」オブジェクトのままであるからです。 – neuronotic
これは値オブジェクトである必要はありません。デーモンによって作成されたコンテナに、2つの作成者オブジェクトによって作成されたすべてのユーザーが含まれていることを確認するだけです。それは理にかなっていますか? – jeff
ええ、私は理解していると思う - それは現在どのように進行しているのですか(ありがと;))。しかし、それはまだ他のオブジェクトの実際の実装にそれをカップリングさせる臭いのビットを残しているようです。私は答えをアップに投票しましたが、私はそれを1日または3日に答えてマーキングするのを延期します。 – neuronotic