测试Builder模式

lau*_*cer 6 java testing mocking builder

我正在尝试单元测试一个看起来像这样的构建器样式模式(mockedObject被注入到函数中,所以我可以模拟它):

Thing thing = 
    mockedObject.createThing()
     .addParam1()
     .addParam2(mockedObject.createParam2()
                   .someData()
                   .build())
    .build();

mockedObject.use(thing);
Run Code Online (Sandbox Code Playgroud)

我正在尝试研究如何测试它(使用JUnit和Easymock)而不必模拟整个构建器对象.我需要对结果对象进行测试,param1param2使用特定值进行设置.

模拟整个构建器模式会使测试变得非常脆弱,而不是我应该开始测试的.

有没有(更好的)测试方法?

Sia*_*and 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();

 }


}
Run Code Online (Sandbox Code Playgroud)

正如您在上面看到的,我为构建器创建了一个深度存根的模拟,然后我可以确保它使用正确的参数正确调用。