2016-07-15 5 views
0

У меня есть метод в моем MainActivity (Android) и я хочу, чтобы дразнить A экземпляр:как издеваются с Mockito

public void some_method() { 
    A a = new A(); 
    .... 
} 

так я создал своего рода фабрики класса как таковой

public class SomeFactory(){ 

// some constructor 
public A populateWithParameter(Parameter parameter){ 
return new A(parameter) 
} 
} 

и выше метод превращается в

public void some_method(SomeFactory someFactory) { 
     A a = someFactory.populateWithParameter(parameter); 
     a.method_call()   
     .... 
    } 

Я попробовал этот

@Mock 
    SomeFactory someFactory; 

public void testSomeMethod() throws Exception { 
     SomeFactory someFactory = new SomeFactory(); 
     when(someFactory.populateWithParameter(
       some_parameter)).thenReturn(null); 

     mainActivity.some_method(someFactory); 
... 
    } 

, но я получаю сообщение об ошибке

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'. 
For example: 
when(mock.getArticles()).thenReturn(articles); 

ответ

1

Вы не насмешливый свой завод. Кроме того, неправильный вызов метода.

Сделайте это вместо этого.

SomeFactory someFactory = mock(SomeFactory.class) 
    when(someFactory.populateWithParameter(
      some_parameter)).thenReturn(null); 

    mainActivity.some_method(someFactory); 

UPDATE

Ваш код изменился так и для полноты это то, что ваш тест должен выглядеть. В обновленном коде выше вы переписали свой mock с реальным объектом. Предположим, что ваши объекты настроены правильно. Обратите внимание на другой синтаксис для предоставления возвращаемого объекта. Я думаю, что это более читаемо.

@Mock SomeFactory mockFactory; 

@Before 
public void setUp() { 
    MockitoAnnotations.initMocks(this); // set up annotated mocks 
} 

@Test 
public void testSomeMethod() { 
    A subject = new A(); 
    doReturn(subject).when(mockFactory) 
         .populateWithParameter(any(Parameter.class)); 
    main_activity.some_method(mockFactory); 
    verify(mockFactory,times(1)).populateWithParameter(any(Parameter.class)); 
} 

Best Practices

  • При присвоении имен методов и переменных, использование верблюжьего. So main_activity будет MainActivity, some_method будет SomeMethod.
+0

Большое вам спасибо за ваш ответ. На самом деле, я положил 'thenReturn (null)' просто, чтобы сделать его простым, но мне нужно что-то вроде 'thenReturn (new A)'. Поэтому, когда я делаю это, я получаю проблему, потому что после создания объекта 'A a' существует метод вызова' a.method_call() ', но затем я получаю' java.lang.NullPointerException: попытка вызвать виртуальный метод " some.package.method_call "в ссылке нулевого объекта". У вас есть идея, как это исправить? – user1611830

+0

Итак, в вашем классе A есть вызов метода method_call? Мне тоже нужно будет увидеть этот код. – StuStirling

+0

уверен, что я только что редактировал мой код! – user1611830

0

Вам необходимо переписать экземпляр A из вашего теста. Обычно это делается с использованием рамки для инъекций. Для простого случая вы можете сделать поле под испытанием protected (при условии, что тестовый класс находится в том же пакете, что и тестируемый класс).

Ошибка, которую вы видите, взаимодействует с «реальным» объектом, как если бы это был макет.

В этом случае SomeFactory реальный объект, поэтому он не может быть when()ed

0

С точки зрения ответа @ DiscoS2, действительно существует проблема с этой декларацией

MockitoAnnotations.initMocks(this); 

Вы должны использовать вместо этого SomeFactory someFactory = mock(SomeFactory.class), а затем следуйте обновленной характеристике @ DiscoS2

Смежные вопросы