2016-11-24 3 views
0

я работать с ПМК узором и Трейд проверить укороченный метод PRESENTERMockito тест неудачу

Это

final public void setOriginPreviewImage() { 
final String path = model.getImageFilePath(); 
iActivityAcceptNotAccept.setPreviewImage(path); 
} 

Этот метод возвращает путь и передать его через интерфейс для просмотра

Это test

public class PresenterActivityAcceptNotAcceptTest { 

private PresenterActivityAcceptNotAccept presenter; 

@Mock ModelAcceptNotAccept model; 
@Mock IActivityAcceptNotAccept iActivityAcceptNotAccept; 

@Before public void setUp() throws Exception { 
    MockitoAnnotations.initMocks(this); 
    presenter = new PresenterActivityAcceptNotAccept(iActivityAcceptNotAccept); 
} 

@Test public void setOriginPreviewImage() throws Exception { 
    presenter.setOriginPreviewImage(); 
    when(model.getImageFilePath()).thenReturn("path"); 
    String path = model.getImageFilePath(); 
    verify(iActivityAcceptNotAccept).setPreviewImage(path); 
} 

здесь, в первой строке, я вызываю метод, затем выполните when(), чтобы указать, что если getImageFilePath() будет вызываться, тогда возвращаем "path" в качестве значения.

В третьей строке я вызываю getImageFilePath() Я ожидаю получить valeu, который я установил до этой строки - "path".

Но вместо этого я получаю такую ​​ошибку

java.lang.NullPointerException в com.fittingroom.newtimezone.tools.cameraTools.ImageSaver.getImageFilePath (ImageSaver.java:37) в com.fittingroom .newtimezone.model.ModelAcceptNotAccept.getImageFilePath (ModelAcceptNotAccept.java:14)

Я получаю ошибку при обработке model.getImageFilePath();

в соответствии с тестом файла журнала не вернуть обратно значение, которое я воздвиг прокат

when(model.getImageFilePath()).thenReturn("path"); 

вместо этого он пытается получить значение из метода, конечно, нет никакого значения, потому что это испытание ...

Как модель, ассоциированные с инфекцией ведущий

public final class PresenterActivityAcceptNotAccept implements IPresenterAcceptNotAccept { 
private IActivityAcceptNotAccept iActivityAcceptNotAccept; 
private ModelAcceptNotAccept model; 

public PresenterActivityAcceptNotAccept(IActivityAcceptNotAccept iActivityAcceptNotAccept) { 
    this.iActivityAcceptNotAccept = iActivityAcceptNotAccept; 
    this.model = new ModelAcceptNotAccept(this); 
} 

код модели

public class ModelAcceptNotAccept { 
private IPresenterAcceptNotAccept iPresenterAcceptNotAccept; 

public ModelAcceptNotAccept(IPresenterAcceptNotAccept iPresenterAcceptNotAccept) { 
    this.iPresenterAcceptNotAccept = iPresenterAcceptNotAccept; 
} 

public String getImageFilePath(){ 
    return ImageSaver.getImageFilePath(); 
} 

} 

Что я делаю неправильно?

EDIT

@Test public void setOriginPreviewImage() throws Exception { 
    //when(model.getImageFilePath()).thenReturn("path"); 
    doReturn("path").when(model.getImageFilePath()); 
    presenter.setOriginPreviewImage(); 
    String path = model.getImageFilePath(); 
    verify(iActivityAcceptNotAccept).setPreviewImage(path); 
} 

дают мне такие ошибки

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here: 
-> at com.fittingroom.newtimezone.presenters.PresenterActivityAcceptNotAcceptTes t.setOriginPreviewImage(PresenterActivityAcceptNotAcceptTest.java:30) 

E.g. thenReturn() may be missing. 
Examples of correct stubbing: 
when(mock.isOk()).thenReturn(true); 
when(mock.isOk()).thenThrow(exception); 
doThrow(exception).when(mock).someVoidMethod(); 
Hints: 
1. missing thenReturn() 
2. you are trying to stub a final method, you naughty developer! 
3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed 


at com.fittingroom.newtimezone.presenters.PresenterActivityAcceptNotAcceptTest.setOriginPreviewImage(PresenterActivityAcceptNotAcceptTest.java:30) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37) 
at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:119) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) 
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234) 
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 

EDIT2

enter image description here

EDIT3

Моего тест Теперь

@Test public void setOriginPreviewImage() throws Exception { 
    presenter.setOriginPreviewImage(); 
    doReturn("path").when(model).getImageFilePath(); 
    String path = model.getImageFilePath(); 
    verify(contractAcceptNotAccept).setPreviewImage(path); 
} 

Ошибка

enter image description here

ответ

1

Для вашего последнего обновления, имейте в виду, что doVerb().when() синтаксис отличается: В отличие от when().thenVerb() синтаксиса, вы не поставите весь вызов метода внутри when аргумента, просто издеваются в вопросе.

/* BAD */ doReturn("path").when(model.getImageFilePath()); 
//         v- see the parens -^ 
/* GOOD */ doReturn("path").when(model).getImageFilePath(); 

Вы получаете это сообщение, потому что синтаксис doReturn начинает готовить пользовательский объект для вас - тот, который имеет все его гася инвалидов - и вместо того, чтобы вызывать when и затем вызывает метод на прокси объект, возвращаемый when(model), вы вызываете метод по оригинальному макету model. Действие stubbing не закончено, как Mockito хотел бы, чтобы это было так, поэтому Mockito выбрасывает исключение UnfinishedStubbingException.

+0

да действительно это выглядит как правильно, но в любом случае я получаю ошибку.Не то же самое, что было, но у меня нет предположений, почему ... Похоже, что метод 'doReturn()' работает неправильно. Я добавил новый скриншот на вопрос 'EDIT3' –

+0

Я нашел ошибку)) эта строка' doReturn («путь»). Когда (model) .getImageFilePath(); 'должна быть первой строкой в ​​методе тестирования) Спасибо –

0

Есть несколько проблем, с вашим кодом:

(1) Добавить @InjectMocks для того, чтобы придать Ложные объектов к PresenterActivityAcceptNotAccept класс

(2) Откажитесь от методов вызова (из @Mock объектов) перед вызовом реальных методов.

(3) Используйте doNothing() для имитации void возвращения метод вызывает

public class PresenterActivityAcceptNotAcceptTest { 

    @InjectMocks 
    private PresenterActivityAcceptNotAccept presenter; 

    @Mock ModelAcceptNotAccept model; 
    @Mock IActivityAcceptNotAccept iActivityAcceptNotAccept; 

    @Before public void setUp() throws Exception { 
     MockitoAnnotations.initMocks(this); 
     presenter = new PresenterActivityAcceptNotAccept(iActivityAcceptNotAccept); 
    } 

    @Test public void setOriginPreviewImage() throws Exception { 
     //mock the method call 
     when(model.getImageFilePath()).thenReturn("path"); 

     //doNothing for void call 
     doNothing().when(iActivityAcceptNotAccept).setPreviewImage("path"); 


     //verify the method call 
     verify(iActivityAcceptNotAccept).setPreviewImage("path"); 
    } 

} 

Вы можете посмотреть here для выборочных тестов о том, как использовать Mockito.

+0

В любом случае я получаю ту же ошибку –

+0

Посмотрите на обновленный ответ, у вас мало проблем с методом теста – developer

+0

Я добавил скриншот для ответа на вопрос ... Он сказал, что мне нужно добавить 'thenReturn' в строке 39, но когда Я пытаюсь добавить '.thenReturn()' studio сказал, что такого метода нет –

0

Используйте Mockito.doReturn(...).when(...);, так как это не вызовет метод издевательства и немедленно возвращает значение макета.

+0

Я попытался это сделать ... Я добавил результат в вопросе ... Я не уверен, что это правильный путь –