2015-05-07 4 views
4

Я испытывал PowerMock, и я пытаюсь издеваться частный метод, как так:PowerMock жалуется на неправильные аргументы, даже если частный метод издевался

expectPrivate(n, "doLogin", anyString(), anyString()).andReturn(true); 

То есть, я хочу true быть возвращена из doLogin независимо от переданных параметров. Открытый метод, который делегирует этот частный метод, просто передает аргументы. Вот определение класса издевались:

class N { 
     public boolean login(String username, String password) { 
      return doLogin(username, password); 
     } 
     private boolean doLogin(String u, String p){ 
      //validate login 
      //... 
      //... 
      return true; 
     } 
    } 

И это тестовый класс, где я пытаюсь вызвать макет:

import static org.junit.Assert.assertEquals; 
import static org.powermock.api.easymock.PowerMock.createPartialMock; 
import static org.powermock.api.easymock.PowerMock.expectPrivate; 
import static org.powermock.api.easymock.PowerMock.replay; 
import static org.powermock.api.easymock.PowerMock.verify; 
import static org.mockito.Matchers.anyString; 

import org.easymock.EasyMock; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 
import org.powermock.reflect.Whitebox; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(N.class) 
public class NodeAccessorTest { 
private String username = "admin"; 
private String password = "asdf"; 

@Test 
public void testMockLogin() throws Exception { 
    N n = createPartialMock(N.class, 
      "doLogin", String.class, String.class); 
    boolean expected = true; 
    expectPrivate(n, "doLogin", anyString(), anyString()).andReturn(expected); 
    replay(n); 
    boolean actual = n.login("A", "B"); 
    verify(n); 
    assertEquals("Expected and actual did not match", expected, actual); 
    } 
} 

Это провал след:

java.lang.AssertionError: 
    Unexpected method call N.doLogin("A", "B"): 
    N.doLogin("", ""): expected: 1, actual: 0 
    at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:44) 
    at org.powermock.api.easymock.internal.invocationcontrol.EasyMockMethodInvocationControl.invoke(EasyMockMethodInvocationControl.java:91) 
    at org.powermock.core.MockGateway.doMethodCall(MockGateway.java:124) 
    at org.powermock.core.MockGateway.methodCall(MockGateway.java:185) 
    at com.pugmarx.mock.N.doLogin(N.java) 
    at com.pugmarx.mock.N.login(N.java:60) 

Таким образом, насмешливая структура недовольна, когда конкретные String s переданы методу public login(), но отлично, когда используется anyString. В идеале я бы ожидал, что, поскольку звонок в private doLogin издевается, этого не должно быть. Что мне не хватает?

+0

Какая у вас ошибка? – Pratik

+0

@Pratik, я обновил вопрос с ним – pugmarx

+0

Можете ли вы опубликовать весь тестовый класс, если это не проблема? Я не вижу никакой проблемы здесь – Pratik

ответ

2

У меня была аналогичная проблема, и я думаю, что ваша проблема может быть в Matchers anyString(), переданной параметром PowerMock expectPrivate.

На основании вашего ввоза вы используете Mockito Соответствующие вместо этого EasyMock Подходы: org.mockito.Matchers.anyString.

Не могли бы вы попробовать изменения Matchers для следующего: EasyMock.anyString()

import org.easymock.EasyMock; 

... 

expectPrivate(n, "doLogin", EasyMock.anyString(), EasyMock.anyString()).andReturn(expected); 

Надеется, что это помогает.

+0

Работает как очарование! Благодаря! Хотя я не понимаю, почему. – pugmarx

+1

Эта ссылка сравнивает два (Mockito v/s EasyMock) и утверждает, что совпадения совпадают. https://code.google.com/p/mockito/wiki/MockitoVSEasyMock – pugmarx

+0

Честно говоря, я не понимаю, почему ... Я также предположил, что мы могли бы использовать Mockito Matchers. Даже я думал, что это ошибка. В любом случае, рад помочь вам! – troig