java - 在不重构的情况下使用 mockito 测试本地作用域对象

标签 java junit mocking junit4 mockito

假设我有以下代码:

public class ClassToTest
{
    AnotherClass anotherClass;

    public void methodToTest( int x, int y )
    {
        int z = x + y
        anotherClass.receiveSomething( z );
    }
}

public class AnotherClass
{
    public void receiveSomething( int z ) {.. do something.. }  
}

我想对变量 z 的值进行断言。我如何在不重构的情况下做到这一点?变量 x、y 和 z 可以是其他一些 Java 类类型,为了简单起见,我只使用“int”。

最佳答案

您可以编写以下内容。 当然,依赖注入(inject)和测试方法可能会根据您当前的实现和/或您的测试场景而改变。

@RunWith(MockitoJUnitRunner.class)
public class ClassToTestTest {

    @Mock AnotherClass anotherClass;
    @InjectMocks ClassToTest classToTest;

    @Test public void ensure_that_value___Z___is_passed_to___AnotherClass() {
        classToTest.methodToTest(1, 2);

        verify(anotherClass).receiveSomething(eq(3));
    }
}

在编写时考虑了 Mockito 1.9.5-rc1。

此外,您还可以使用 ArgumentCaptor 而不是使用 eq 匹配器,它将捕获值或值引用(在对象的情况下)。您将能够对捕获的值执行其他断言。例如使用 Truth 或 FEST-Assert。

这可能看起来像:

@RunWith(MockitoJUnitRunner.class)
public class ClassToTestTest {

    ...
    @Captor ArgumentCaptor<List<Z>> listCaptor

    @Test public void ensure_that_list_with_value___Z___is_passed_to___AnotherClass() {
        // given

        // when
        ...

        // then
        verify(anotherClass).receiveList(listCaptor.capture());
        assertThat(listCaptor.getValue()).contains(Z);
    }
}

干杯,

关于java - 在不重构的情况下使用 mockito 测试本地作用域对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12156516/

相关文章:

java - Swing 面板可调整间隙

java - 在 Preon 中解析可变记录长度

java - 为什么Spring的<jdbc :embedded-database> throw a SQLSyntaxErrorException?

java - 尝试对使用 Hibernate 进行数据库查询且无法创建 session 的类进行单元测试

java - 是否可以在 Eclipse 中从多个包运行 JUnit 测试?

php - 在 PHPUnit 中,如何模拟父方法?

java - Jvm 需要很长时间才能解析 localhost 的 ip 地址

java - Java计算5次考试成绩的平均值

asp.net-mvc - 在不访问数据库的情况下测试 ASP.NET MVC Controller 的干净方法?

javascript - ReactJs 测试模拟组件输入和响应,从哪里开始?