Pergunta

Eu sou novo para jMock e tentando zombar uma HttpSession. Eu estou começando:

java.lang.AssertionError: invocação inesperada: httpServletRequest.getSession () sem expectativas especificadas: você ... - esqueça de iniciar uma expectativa com uma cláusula de cardinalidade? -? Chamar um método zombou para especificar o parâmetro de uma expectativa

o método de teste:

@Test

public void testDoAuthorization(){

    final HttpServletRequest request = context.mock(HttpServletRequest.class);
    final HttpSession session = request.getSession();

    context.checking(new Expectations(){{
       one(request).getSession(true); will(returnValue(session));
   }});

    assertTrue(dwnLoadCel.doAuthorization(session));
}

Eu fiz um pouco de pesquisa e não é claro para mim ainda como isso é feito. Parece que eu estou faltando alguma pequena peça. Qualquer pessoa com experiência neste pode me apontar na direção certa. graças

Foi útil?

Solução

Você não precisa zombar o objeto pedido. Como o método que você está testando (dwnLoadCel.doAuthorization()) depende apenas de um objeto HttpSession, que é o que você deve zombar. Portanto, o seu código ficaria assim:

public void testDoAuthorization(){
    final HttpSession session = context.mock(HttpSession.class);

    context.checking(new Expectations(){{
        // ???
    }});

    assertTrue(dwnLoadCel.doAuthorization(session));

}

A pergunta é: o que você espera do SUT para realmente do com o objeto de sessão? Você precisa de expressar em suas expectativas as chamadas para session e seus valores de retorno correspondentes que deveriam resultar em doAuthorization true retornar.

Outras dicas

Eu acho que você precisa dizer ao contexto JMock quantas vezes você espera que o método a ser chamado antes de realmente ir em frente e chamá-lo.

final HttpServletRequest request = context.mock(HttpServletRequest.class);

context.checking(new Expectations(){{
  one(request).getSession(true); will(returnValue(session));
}});

final HttpSession session = request.getSession();

Eu não estou super familiarizado com JMock mas você realmente se importa em seu teste de unidade dwnLoadCel quantas vezes métodos determinada no objeto zombado são chamados? Ou você está apenas tentando testar sua classe que depende de uma HttpSession sem uma sessão real? Se ele é o último do que eu acho que JMock é um exagero para você.

Você pode querer olhar em qualquer criação de uma classe que implementa a HttpSession interface de si mesmo para efeitos de testes de unidade única (um esboço), e executar seus testes fora do que, ou você deve dar uma olhada dwnLoadCel e determinar se it realmente tem de ter uma referência para o HttpSession, ou se ele só precisa de algumas propriedades dentro da HttpSession. Refactor dwnLoadCel apenas depender do que ele realmente precisa (a Map ou um determinado valor do parâmetro dentro do objeto Session.) - isso vai fazer o teste de unidade mais fácil (a dependência do servlet container vai bye-bye)

Eu acho que você tem algum nível de injeção de dependência em sua classe que está sendo testado já, mas você pode ser dependente muito ampla de um objeto. O Teste Google Blog teve um monte de excelente artigos em DI ultimamente que você pode achar útil (I certo têm).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top