2015-04-06 3 views
1

Я проверил все существующие проблемы с переполнением стека. Но я не мог найти правильное решение.Служба вызывает фактический класс вместо издевающегося класса. Junit4 и Jmock

public class TestAuthenticate { 
private RestService rs; 
private String token_actual = token1; 
private Mockery context; 
private Authenticate authenticate_object; 


@Before 
public void setup(){ 
context = new JUnit4Mockery() {{ 
    setImposteriser(ClassImposteriser.INSTANCE); 
}}; 

rs = new RestService(); 
} 

@Test 
public final void testAuthenticate() { 

    authenticate_object = context.mock(Authenticate.class); 

    context.checking(new Expectations() { 
     { 
      oneOf(authenticate_object).authenticate_method("username", "password"); 
      will(returnValue(token1)); 
     } 
    }); 
    String token = rs.authenticate("username", "password"); 
    System.out.println(token); 

    assertEquals(token_actual, token); 
    context.assertIsSatisfied(); 
} 

}

Это звонит фактический метод AUTHENTICATE вместо макета класса AUTHENTICATE. Может ли кто-нибудь сказать мне, что я делаю неправильно?

public class RestService { 
public string authenticate(String user, String pass){ 
Authenticate auth = new Authenticate(); 
String res = auth.authenticate(user,pass); 
} 
return res; 
} 
+1

Я не вижу где-нибудь, что вы передаете в 'authenticate' объекта к чему-либо. Как «RestService» должен его получить? – chrylis

+0

См. Мой обновленный код. Служба Rest имеет метод аутентификации, который вызывает объект Authenticate. – Jenny

+1

Нет ... вы * создаете * новый 'Authenticate' каждый раз, когда этот метод вызывается. Интересно, имеет ли JMock что-то, что эквивалентно Mockito, в котором можно фактически издеваться над новыми вызовами. – Makoto

ответ

0

Обычно вы будете использовать некоторые формы Dependency Injection, чтобы ввести фиктивный AuthenticationService в RestService. Попробуйте переписывать RestService как,

public class RestService { 
    private final AuthenticateService auth; 
    public RestService(AuthenticateService auth) { 
     this.auth = auth; 
    } 
    public string authenticate(String user, String pass){ 
     return auth.authenticate(user,pass); 
    } 
} 

, а затем в тесте сделать

rs = new RestService(authenticate_object); 
+0

Я сделал это, но у меня есть 7 методов, и я не могу написать 7 конструкторов. Также в каждом методе маркер переходит в качестве параметра. Поэтому я должен снова вызвать аутентификацию в каждом методе. Есть ли другое решение? – Jenny

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