我正在尝试对如下所示的构建器样式模式进行单元测试(将 mockedObject 注入(inject)到函数中,以便我可以模拟它):
Thing thing =
mockedObject.createThing()
.addParam1()
.addParam2(mockedObject.createParam2()
.someData()
.build())
.build();
mockedObject.use(thing);
我正在尝试找出如何测试它(使用 JUnit 和 Easymock)而不必模拟整个构建器对象。我需要对结果对象进行测试的是 param1
和 param2
设置了特定的值。
模拟整个构建器模式会使测试非常脆弱,这不是我应该开始测试的。
是否有(更好的)方法来测试它?
最佳答案
通过 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();
}
}
正如您在上面看到的,我为构建器创建了一个深入 stub 的模拟,然后我可以确保它使用正确的参数正确调用。
关于java - 测试构建器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4858321/