2016-02-27 11 views
0

Я пытаюсь проверить свой метод контроллера в Play Framework 2.4.6. Внутри мой метод контроллера, у меня есть следующий код:Использование Mockito 'when' в тестировании контроллера

User user = accountService.getUserByEmail(email); 
if (user == null) { 
    //Path A 
} 
//Path B 

При выполнении теста, user будет нулевым. Поэтому я не могу проверить Path B. Я попытался вернуть пользователя, используя Mockitowhen, но он тоже не работал. Есть ли другой способ сделать это?

Ниже мой тестовый код:

RequestBuilder request = new RequestBuilder() 
      .method("POST") 
      .bodyForm(ImmutableMap.of("email", "[email protected]")) 
      .uri(controllers.routes.ResetPasswordController.postResetPassword().url()); 

    when(accountService.getUserByEmail(anyString())).thenReturn(new User()); 

    assertEquals(OK, route(request).status()); 
+1

Ваш 'accountService' макет экземпляр должен быть известен рамках Play. E.e. быть зарегистрированным в качестве Службы Play. –

+0

@AndriyKryvtsun Извините, не забудьте подробно остановиться на 'register as Play service'? Я не могу найти никаких значимых результатов, связанных с этим. – DxHito

ответ

0

Благодаря @Andriy указал мне в правильном направлении для Dependency Injection.
Мне удалось решить проблему с помощью следующей настройки.

Тест:

public class TestClass { 
@Inject 
Application application; 

final AccountService accountServiceMock = mock(AccountService.class); 

@Before 
public void setup() { 
    Module testModule = new AbstractModule() { 
     @Override 
     public void configure() { 
      bind(AccountService.class).toInstance(accountServiceMock); 
     } 
    }; 

    GuiceApplicationBuilder builder = new GuiceApplicationLoader() 
      .builder(new ApplicationLoader.Context(Environment.simple())) 
      .overrides(testModule); 
    Guice.createInjector(builder.applicationModule()).injectMembers(this); 

    Helpers.start(application); 
} 

@Test 
public void testMethod() throws Exception { 
    RequestBuilder request = new RequestBuilder() 
      .session("userId", "1") 
      .uri(controllers.routes.AccountController.addAccount().url()); 

    running(application,() -> { 
     when(accountServiceMock.addAccount().thenReturn(true); 
     assertEquals(OK, route(request).status()); 
    }); 
} 

Контроллер:

@Singleton 
public class AccountController extends Controller { 
    private AccountService accountService; 

    @Inject 
    public Controller(AccountService a) { 
     accountService = a; 
    } 

    public Result addAccount() { 
    boolean success = accountService.addAccount(); 
    } 
} 

Интерфейс:

@ImplementedBy(AccountServiceImpl.class) 
public interface AccountService { 
    boolean addAccount(); 
} 

Реализация:

public class AccountServiceImpl implements AccountService { 
    @Override 
    public boolean addAccount() { 
    } 
} 

Мои знания минимальны на понятиях здесь происходит, но примерно:

  • контроллер без гражданства, как и HTML, следовательно, вам нужна инъекция зависимостей во время выполнения, чтобы играть в признать макет объекта.

Полезные Документации: https://www.playframework.com/documentation/2.4.x/JavaTestingWithGuice https://www.playframework.com/documentation/2.4.x/JavaDependencyInjection

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