Имитация побочных эффектов смоделированного метода - PullRequest
2 голосов
/ 31 июля 2011

У меня есть метод в классе, который вызывает побочные эффекты для параметра метода:

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 ]

4 голосов
/ 01 августа 2011

Вы можете использовать объект 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);
    }};
}
0 голосов
/ 01 августа 2011

Поскольку тест пытается сказать вам, побочные эффекты не являются частью поведения ClassUnderTest.Не пытайтесь проверить это здесь.Исходя из кода, который вы показываете, все, что вам нужно проверить, это то, что results передается в doSomethingWithSideEffects() и тот же объект возвращается из execute().Будучи незнакомым с синтаксисом JMockit, я не могу точно сказать вам, как его написать.

В сторону: однако, я рекомендую всем, кто использует такой инструмент, как jMock, JMockit или EasyMock, использовать Mockito вместо этого, если они могут.

...