java - Easymock - 嵌套无效方法测试( spy )

标签 java junit4 mockito easymock

如何在 getData() 模拟测试期间监视嵌套方法中的参数“param”? Easymock 3 有可能吗?

源代码

public class ServiceLogic {

 public void getData(){

  // some business logic

  serviceDAO.executeStatement(param);   

 }

}

Easymock 测试:

ServiceLogic _serviceLogicMock = EasyMock.createNiceMock(ServiceLogic.class);
ServiceDAO _serviceDAOMock = EasyMock.createNiceMock(ServiceDAO .class);

_serviceLogicMock.setServiceDAO(_serviceDAOMock);

//some other method calls -> .execute(...).andReturn(...);
EasyMock.replay(_serviceLogicMock);

//run
_serviceLogicMock.getData();

如何使用 EasyMock 检查是否使用正确的参数调用了 executeStatement() 方法?!

最佳答案

你的测试似乎是错误的:

  • 您的单元测试是关于测试 ServiceLogic 那么您为什么要模拟它?
  • 此外,您对与 ServiceDAO 模拟的任何交互也不抱任何期望。

由于问题被标记为 Mockito,我提出了以下解决方案(减去导入),您可以根据自己的代码进行调整:

@RunWith(MockitoJUnitRunner.class)
public class ServiceLogicTest {
    @Mock ServiceDAO serviceDAO;
    @InjectMocks ServiceLogic serviceLogic;

    @Test
    public void ensure_executeStatement_is_called_with_right_param() throws Exception {
        // given
        String input = "Some input";

        // when
        serviceLogic.getDataFrom(input);

        // then
        verify(serviceDAO).executeStatement("expected param");
    }
}

在编写测试时,我喜欢使用 BDD(行为驱动开发)风格来引导我去测试我想要测试的东西。我鼓励你练习它,你可以看看 wiki page .

所以对于你的问题,你应该看一下 verify 行,它将模拟置于验证模式,因此可以实际验证方法 executeStatement 是实际上用参数值 "expected param" 调用。

如果你有更复杂的参数,你可以使用一些使用 Hamcrest 的匹配器library :

verify(serviceDAO).executeStatement(argThat(hasProperty("propertyName")));

或者您可以将 Mockito 的 ArgumentCaptorFEST-Assert library 结合使用(通常是我的首选方法):

ArgumentCaptor<ComplexArgument> argCaptor = ArgumentCaptor.forClass(ComplexArgument.class);
verify(serviceDAO).executeStatement(argCaptor.capture());
assertThat(argCaptor.getValue()).isNotNull().satisfies(myComplexArgumentCondition());

主要思想是有understandable code ,在生产代码中在测试代码中。

要进一步阅读,请查看 Mockito Javadoc .

关于java - Easymock - 嵌套无效方法测试( spy ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8600927/

相关文章:

java - WELD-001201 : Error loading beans. xml + Tomcat 7.0.59

java - org.junit.contrib.java.lang.system.StandardOutputStreamLog 在哪里?

java - 模拟与正在测试的类不同的类函数

java - 为什么java找不到JUnit框架?

java - netty(或java NIO) channel 是先进先出的吗?

java - 绘制随机圆,首先将点存储在数组中

maven - 使用 Maven 3 是否可以使用与编译插件中设置不同的 java 版本来运行 JUNIT 测试?

java - 将字符添加到 BufferedReader

java - 如果模拟对象在实现类中设置为 null,则失去模拟

java - PowerMockito 模拟通用构造函数