2016-06-09 5 views
0

Этот вопрос, вероятно, был задан много раз раньше. Однако я не мог найти ответы нигде. Здесь я имею дело с устаревшим кодом.Отказывание локальных объектов области с использованием Powermock и mockito в статическом методе

Обращаем ваше внимание, что: Я упрощаю свой вопрос, чтобы получить конкретный ответ. Фрагменты кода представляют только проблему, с которой я сталкиваюсь. Не тот код, который я пытаюсь проверить. Этот фрагмент кода, который будет тестироваться здесь, представляет собой часть общего кода, который мне нужно проверить.

Проблема: myObj.loadContent (NULL, NULL) фактически вызывается вместо ничего не делать, как указано с PowerMockito.doNothing(), когда (mockObj) .loadContent (NULL, NULL);.

код Я хочу модульного тестирования:

class ClassInstantiatingObject { 
. 
. 
    public static void doSomething(Arg1 arg1, Arg2 arg2) throws Exception{ 
     MyClass myObj = new MyClass(arg1, arg2); 
     myObj.loadContent(null, null); 
    } 
} 

My Test Unit:

import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Mockito; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 
. 
. 
. 
@Test 
public void testDoSomething() throws Exception { 
    MyClass mockObj = PowerMockito.mock(MyClass.class); 
    PowerMockito.whenNew(MyClass.class).withAnyArguments().thenReturn(mockObj); 
    PowerMockito.doNothing().when(mockObj).loadContent(null, null); 
    Arg1 mockArg1 = mock(Arg1.class); 
    Arg2 mockArg2 = mock(Arg2.class); 
    StaticClass.doSomething(mockArg1, mockArg2); 
} 

Код для тестирования не может быть изменен. Следовательно, мне нужен способ фактически не вызвать loadContent (null, null) с помощью mockito/powermock.

Кроме того, при использовании:.. PowerMockito.doNothing(), когда (MyClass.class "LoadContent", NULL, NULL) ИЛИ PowerMockito.doNothing(), когда (MyClass.class "LoadContent", Mockito.anyString(), Mockito.anyMap())

Я получаю java.lang.NullPointerException в org.powermock.api.mockito.internal.expectation.PowerMockitoStubberImpl.addAnswersForStubbing

+0

Вы правильно указали свой тестовый класс ('@RunWith (PowerMockRunner.class) @PrepareForTest (MyClass.class'))? – troig

+0

@troig Да, я сделал оба. @RunWith (PowerMockRunner.class) @PrepareForTest ({MyClass.class, MyClass1.class}) –

+0

FYI Я обошел эту проблему, издеваясь над вызовами в методе, возвращающем пустоту с помощью PowerMockito. Однако я все еще не понимаю, почему это не сработает. –

ответ

2

Правильный ответ

Я вам удалось найти решение. Очень просто быть честным.

В приведенном выше примере. То, что мне не хватало, в случае использования PowerMockito.whenNew(), класс, вызывающий конструктор, который вы хотите высмеять, должен быть указан в аннотации @PrepareForTest. Класс, конструктор которого вы хотите издеваться, не обязательно должен быть указан.

Для примера.

import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Mockito; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

@RunWith(PowerMockRunner.class) 

//Only need to declare the class calling the constructor to use 
//PowerMockito.whenNew(). You do not need to declare the class whose mock 
//you plan on returning in case of the constructor call. 
//In this case, no need to mention MyClass.class in PrepareForTest 

@PrepareForTest({ClassInstantiatingObject.class}) 
public class ClassInstantiatingObjectTest 
{ 
. 
. 
. 
    @Test 
    public void testDoSomething() throws Exception { 
     MyClass mockObj = PowerMockito.mock(MyClass.class); 
     PowerMockito.whenNew(MyClass.class).withAnyArguments().thenReturn(mockObj); 

     //Only way to do nothing via Powermock for a local scope object 
     //whose method call returns void 

     //PowerMockito.doNothing().when(mockObj.loadContent(null,null)); 
     //will cause a compile time exception 

     PowerMockito.doNothing().when(mockObj,"loadContent",null,null); 
     Arg1 mockArg1 = mock(Arg1.class); 
     Arg2 mockArg2 = mock(Arg2.class); 
     StaticClass.doSomething(mockArg1, mockArg2); 
    } 
} 

Вышеупомянутый код будет решением.

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