2012-05-15 2 views
3

Мне нужно написать тест, где-в-о, поведение класса может быть проверено для разных типов поведения Вымытый класс. Чтобы поддерживать несколько способов поведения для одного и того же метода, нам нужно время от времени издеваться над классом в том же TestClass.JMockIt: Возможно ли издеваться над тем же классом дважды, в том же TestClass, чтобы проверить поведение в разных сценариях.

Возможно ли использование JMockIt?

Вот пример того, что я хочу. Это основной класс для тестирования и его тест:

public class MyClass { 

    private Foo fooObj = null; 

    public setfooObj(Foo obj) { 
     fooObj = obj; 
    } 

    public boolean process() { 
     // uses fooObj.getName() to process 
    } 
} 

public class MyClassTest { 

    @MockClass(realClass = mypackage.Foo.class) 
    public static class MockFoo { 

     @Mock 
     public static boolean getName() { 
      return "test"; 
     } 
    } 

    @Test 
    public void validateProcessing() { 
     MyClass testObj = new MyClass(); 
     assertEquals(false, testObj.process); 
    } 
} 

Теперь я хочу, чтобы проверить поведение testObj.process() метода,, когда MockFoo.getName() возвращает разные значения. Для моего первого утверждения я хочу использовать его значение как «test» (как возвращено функцией mocked), но для следующих, я хочу проверить разные значения.

+0

Не ясно. Возможно. Но я не знаю, чего ты хочешь. – nnhthuan

+0

Вот пример того, что я хочу. Это основной класс для тестирования. 'public class MyClass { \t частный Foo fooObj = null; \t общественный setfooObj (Foo obj) { \t fooObj = obj; \t} \t общественного логический процесс() { \t \t // использует fooObj.getName() для обработки \t}} испытаний Класс: общественного класса MyClassTest { \t MockClass (realClass = package.Foo.class) \t общественный статический класс MockFoo { \t \t Mock \t \t общественности статической булевых GetName() { \t \t \t возвращение "контрольная работа"; \t \t}} \t \t Тест \t общественного недействительного validateProcessing() { \t \t МойКласс testObj = новый MyClass(); \t \t assertEquals (false, testObj.обработать); } } ' – neha1395049

+0

@nnhthuan: См. Приведенный выше код. Теперь я хочу проверить поведение метода testObj.process(), когда MockFoo.getName() возвращает разные значения. Для моего первого утверждения я хочу использовать его значение как «тест» (возвращаемое функцией mocked), но для следующих, я хочу проверить разные значения. Пожалуйста, предложите. Благодаря! – neha1395049

ответ

1

Это легко решить, и нет необходимости издеваться над тем же классом дважды. Чтобы возвращать разные значения из одного и того же изделенного метода в разных вызовах, просто запишите два (или более) последовательных возвращаемых значения при использовании «API ожиданий»; если вы используете «Mockups API», добавьте первый параметр типа «Invocation inv» в ваш макетный метод, а затем используйте «inv.getInvocationIndex()», чтобы узнать, какое значение должно быть возвращено (не так хорошо, как другой параметр, но работает отлично).

Дополнительную документацию и примеры см. На сайте проекта JMockit или в каталоге «jmockit/www» в полном дистрибутиве.

+0

Спасибо @Rogerio. Я выбрал решение API ожиданий. – neha1395049

0

Да, вы можете использовать аннотацию @Injectable вместо @Mocked, а затем каждый макет будет отдельным экземпляром. Вы можете выполнять различные ожидания/проверки в этих случаях.

Пример из the tutorial:

@Test 
public void concatenateInputStreams(
    @Injectable final InputStream input1, 
    @Injectable final InputStream input2) 
{ 
    new Expectations() {{ 
    input1.read(); returns(1, 2, -1); 
    input2.read(); returns(3, -1); 
    }}; 

    InputStream concatenatedInput = new ConcatenatingInputStream(input1, input2); 
    byte[] buf = new byte[3]; 
    concatenatedInput.read(buf); 

    assertArrayEquals(new byte[] {1, 2, 3}, buf); 
}