java - 测试构建器模式

标签 java testing mocking builder

我正在尝试对如下所示的构建器样式模式进行单元测试(将 mockedObject 注入(inject)到函数中,以便我可以模拟它):

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

mockedObject.use(thing);

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

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

是否有(更好的)方法来测试它?

最佳答案

通过 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/

相关文章:

java - show() 时弹出菜单崩溃;

python - 将 MagicMock return_value 实例方法可调用更改为 PropertyMock

python - 使用相同的模拟在两个不同的文件中修补相同的模块

Javascript:使用 Sinon 模拟构造函数

java - 在单个流中组合 allMatch、noneMatch 和 anyMatch

java - 在主类中初始化的对象并在方法/函数中使用相同的对象用于不同的目的?

Java - 将计划分为几个部分

python - 在 pytest 中,如何访问传递给测试的参数?

如果尝试禁用 TagExpressionEditor,Silverlight 测试会运行两次

testing - 运行 munit 测试任务后 bamboo 作业失败