我正在尝试单元测试一个看起来像这样的构建器样式模式(mockedObject被注入到函数中,所以我可以模拟它):
Thing thing =
mockedObject.createThing()
.addParam1()
.addParam2(mockedObject.createParam2()
.someData()
.build())
.build();
mockedObject.use(thing);
我正在尝试研究如何测试它(使用JUnit和Easymock)而不必模拟整个构建器对象。我需要在结果对象上测试的是param1
和param2
设置了特定值。
模拟整个构建器模式会使测试非常脆弱,而不是我应该开始测试的。
有没有(更好的)测试方法?
答案 0 :(得分:0)
我试图找出如何测试它(使用JUnit和Easymock)而不必模拟整个构建器对象。我需要在结果对象上测试的是param1和param2都设置了特定的值。
模拟整个构建器模式 会使测试非常脆弱 而不是我应该测试的东西 开头。
您尝试在此测试的 究竟是什么行为?如果您正在测试构建器是否正确构建了对象,则构建器不是您应该嘲笑的东西。
如果您发布您正在测试的方法和更完整的测试代码,问题可能会更清楚,但现在看起来并不像测试。
答案 1 :(得分:0)
通过Mokito和JUnit5,您可以将RETURNS_DEEP_STUBS用于模拟。例如,下面是一个示例:
@ExtendWith(MockitoExtension.class)
@RunWith(JUnitPlatform.class)
class TargetClassTest {
private static final long SUBJECT_ID;
@Mock
private AuthService authService;
@Mock(answer = Answers.RETURNS_DEEP_STUBS) // deeply stubbed
private Logger logger;
@InjectMocks
private TargetClass service;
@Test
void test_whenSomething_thenResult() {
service.command(SUBJECT_ID);
verify(logger,times(1)).builder(eq(SUBJECT_ID));
verify(loggerbuilder(eq(SUBJECT_ID)),times(1)).thirdPartyLog(eq(DATA_DOG));
verify(loggerbuilder(eq(SUBJECT_ID)).thirdPartyLog(DATA_DOG),times(1)).send();
}
}
如您在上面看到的,我为构建器创建了一个深深的存根模拟,然后确保可以使用适当的参数正确地调用它。