메소드가 mock 객체에 의해 리턴 된 다른 여러 컨테이너의 집합 인 콜렉션을 캡슐화하는 컨테이너를 리턴하는지 확인하는 방법에 대해 궁금합니다. 즉, 개별 컨테이너의 모든 요소를 포함합니다. 다른 곳에서 컨테이너의 'works'(add/addAll/etc)를 검사하는 테스트가 있기 때문에 작동하는 것을 알 수 있습니다. 그러나 'createsRoadUsersAccordingToAllAddedCreators'아래의 테스트가 어떻게 진행되는지 잘 모르겠습니다.컬렉션을 캡슐화하는 객체를 조롱하기
나는 추가 된 RoadUserCreator 's에 따라 RoadUserContainer를 반환하는 Create를 호출하는 RoadUserCreationDaemon 클래스를 가지고 있습니다. 단순화 된 버전 :
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와 조롱에 새로운 오전, 이것은> 육년에 내 첫 자바 프로젝트이기 때문에 보조 미학에 대한 의견을 주시기 바랍니다!
컨테이너가 '값'객체로 남아있게하려면 실제 컨테이너를 만드는 것이 좋습니다. – neuronotic
값 오브젝트 일 필요는 없습니다. 데몬이 작성한 컨테이너에 2 개의 작성자 오브젝트가 작성한 모든 사용자가 들어 있는지 확인하십시오. 말이 돼? – jeff
그래, 나는 이해했다고 생각한다. - 그리고 그것은 현재 내가 어떻게 진행 했는가이다 (고맙다;)). 그러나, 그것은 여전히 다른 객체의 실제 구현에 연결하는 약간의 냄새를 남기는 것처럼 보입니다. 나는 대답에 대해 찬성표를 던졌지 만, 나는 하루나 이틀 동안 답변을 표시하지 않도록 할 것이다. – neuronotic