【问题标题】:Testing local scoped object with mockito without refactoring在不重构的情况下使用 mockito 测试本地范围对象
【发布时间】:2012-08-28 09:37:03
【问题描述】:

假设我有以下代码:

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”。

【问题讨论】:

    标签: java junit mocking junit4 mockito


    【解决方案1】:

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

    @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。

    也可以不使用eq 匹配器,而是使用ArgumentCaptor,它将捕获值或值引用(在对象的情况下)。您将能够对捕获的值执行其他断言。例如使用 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);
        }
    }
    

    干杯,

    【讨论】:

    • 谢谢。如果 z 属于某个 java 类,我想检查 z 的属性怎么办?说,我可能有一些逻辑,而不仅仅是简单的比较。
    • @supertonsky 是的,我以为我在第一个答案中错过了这一点,我只是对其进行了编辑以填补有关特定断言的缺失内容 :)
    猜你喜欢
    • 2011-09-25
    • 1970-01-01
    • 2012-06-11
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 2019-06-27
    相关资源
    最近更新 更多