模拟模拟方法的副作用

时间:2011-07-31 19:49:18

标签: java jmockit side-effects

我在类中有一个方法会对方法的参数产生副作用:

public void SideEffectsClass {
    public void doSomethingWithSideEffects(List<Object> list) {
        // do something to the list
    }
}

正在测试这个课程:

public void ClassUnderTest() {
   public List<Object> execute() {
       List<Object> results = new ArrayList<Object>();
       new SideEffectsClass().doSomethingWithSideEffects(results);
       return results;
   }
}

我使用JMockit的测试方法:

@Test
public void test() throws Exception
{
    // arrange
    new Expectations()
    {
        SideEffectsClass sideEffects;
        {
            new SideEffectsClass();
            sideEffects.doSomethingWithSideEffects((List<Object>) any);
            // I want to simulate that the List<Object> parameter has changed 
            // (has more elements, less elements, etc. after this method is called
        }
    };

    // act
    ClassUnderTest testClass = new ClassUnderTest();
    List<Object> results = testClass.execute();

    // assert
    Assert.assertEquals(myExpectedResults, results);
}

2 个答案:

答案 0 :(得分:4)

您可以使用Delegate对象更改参数值:

    sideEffects.doSomethingWithSideEffects((List<Object>) any);
    result = new Delegate() {
        void delegate(List<Object> list) { list.add(new Object()); }
    };

如果您只需要验证调用了doSomethingWithSideEffects方法,那么测试可以更简单地编写为:

@Test
public void test(final SideEffectsClass sideEffects)
{
    List<Object> results = new ClassUnderTest().execute();

    assertEquals(myExpectedResults, results);

    new Verifications() {{
        sideEffects.doSomethingWithSideEffects((List<Object>) any);
    }};
}

答案 1 :(得分:0)

正如测试试图告诉你的那样,副作用不是ClassUnderTest行为的一部分。不要试图在这里测试。根据您显示的代码,您应该测试的是results传递给doSomethingWithSideEffects()并且execute()返回相同的对象。由于不熟悉JMockit语法,我无法准确地告诉你如何编写它。

除此之外:我建议每个使用jMock,JMockit或EasyMock等工具的人都应该使用Mockito,如果可以的话。