2

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

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);
}
4

2 回答 2

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);
    }};
}
于 2011-07-31T22:26:54.273 回答
0

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

另外:不过,我确实建议使用 jMock、JMockit 或 EasyMock 等工具的每个人都应该尽可能使用Mockito

于 2011-07-31T20:00:52.360 回答