Duvida Mockito + coverage

olá pessoal,

queria tirar uma duvida com vcs, tenho um ambiente com o http://www.eclemma.org/index.html o qual uso para saber qtos % dos meus tests estão cobertos. Quando nao uso uma API de mock, agora estou usando o Mockito a classe core tem seu % de cobertura, porem nas classes que são “mockadas” não aparece a cobertura, porem todos os testes estão passando.

A duvida é como, eu posso resolver isso? de saber qtos % das classes q usam mock estao cobertas?

Alguem já passou por isso?

flw.

As classes que estao mockadas nao estao sendo utilizadas, logo nao deveriam ter cobertura nenhuma…

Acho que eu nao entendi a duvida direito, pode esclarecer melhor qual o numero que esta errado?

opa! cv. é isso que está rolando as classes mockadas estão sem cobertura, e achei que tinha algo de errado nisso. que elas deveriam ter, e como faria para cobrir. Então sempre que mockar terei 0% de cobertura, pq?

flw.

[quote=LPJava]opa! cv. é isso que está rolando as classes mockadas estão sem cobertura, e achei que tinha algo de errado nisso. que elas deveriam ter, e como faria para cobrir. Então sempre que mockar terei 0% de cobertura, pq?

flw. [/quote]

Porque esse teste não está testando a classe mockada. Crie outro teste para testar essa classe de verdade. Assim vc terá cobertura nela também.

hm, mais se eu testar a classe real, estarei dependendo da conexao com o BD etc. um exemplo basico:

public class UsuarioDAO extends DAO {

	public void cadastrar(Usuario us) {
		try {
			if (buscaUsuarioPorEmail(us) == null) {
				begin();
				getSession().save(us);
				commit();				
			}

		} catch (HibernateException e) {
			e.printStackTrace();
			rollback();
			close();
		}
	}
	
	public void excluir(Usuario us) {
		begin();
		getSession().delete(us);
		commit();		
	}

Como testaria isso?

Hoje tenho algo assim:

public class UsuarioDAOTest {
	@Mock
	private UsuarioDAO usuarioDaoMock;
	private Usuario user ;
		
	@Before
	public void setUp() throws Exception {
		usuarioDaoMock = mock(UsuarioDAO.class);
		user = new Usuario();
	}
	 
	@Test
	public void testBuscaUsuarioCadastrado() {
			user.setEmail("efigenia@");		
		when(usuarioDaoMock.buscaUsuarioPorEmail(user)).thenReturn(user);
		assertEquals(user.getEmail(), usuarioDaoMock.buscaUsuarioPorEmail(user).getEmail());
	}

	@Test
	public void testUsuarioInexistente() {		
		user.setEmail("neto@");
		when(usuarioDaoMock.buscaUsuarioPorEmail(user)).thenReturn(null);
		assertNull(usuarioDaoMock.buscaUsuarioPorEmail(user));
	}

	@Test
	public void testNaoDuplicaUsuarios() {
				
		user.setNome("efigenia");
		user.setSenha("123");
		user.setTipo("usuario");
		user.setEmail("efigenia@");
		user.setSobrenome("mauricio");
		usuarioDaoMock.cadastrar(user);
		Mockito.verify(usuarioDaoMock).cadastrar(user);
	}
....

Mas, a cobertura para classe UsuarioDAO é 0%. Isso que n entendi como resolver.

flw, pessoal. :smiley:

Não gosto de mocks… Para testar interações com o banco utilizo a classe real.

No hibernate.cfg.xml eu configuro: create

E no @BeforeClass de cada teste eu recrio a session factory (assim recria também o banco).
No @BeforeClass eu também populo o banco (que está vazio) com os dados necessários para os testes

Eu faria algo assim no seu teste:


UsuarioDao usuarios = new UsuarioDao();

@Test  
public void deveriaBuscarPorEmailUmUsuarioCadastrado() 
{  
 usuario.setEmail("efigenia@");       
 usuarios.cadastrar(usuario);

 Usuario encontrado = usuarios.buscarPorEmail("efigenia@"); 
 assertNotNull(encontrado);
 assertEquals(usuario.getEmail(), encontrado.getEmail());
}

Observação: É apenas uma dica de como utilizo. Não sei se a maneira mais adequada, mas no meu caso tem funcionado.

pois eh eu tb fiz assim já, e nao sabia se estava fazendo de forma adequada.

Se o teste toca o banco de dados, ele não é um teste unitário. Eu mockaria o mẽtodo getSession e retornaria um MockSession.

opa! pessoal,

achei a solucao usando mockito, hehe dando uma lida na documentacao http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#when%28T%29 eu vi esse cara aqui:

public static Stubber doCallRealMethod()

o qual chama o metodo real e mantendo o lance da mock. nao pensei duas vezes para testar e agora está cobrindo.
Vejam como ficou e agora está chamando o metodo real usando uma mock.
Bem, nao sei se há outra forma melhor de fazer isso, mas acho que já atende.

alguem já tinha implementado assim?

abracos,


PessoALL gostaria de fazer uma pergunta que deve ser básica para vocês, mas que não entra na minha cabeça.

Por que criar uma método de teste que verifica o resultado do que foi mockado?

Veja o código abaixo. Nunca vai dar erro. Gerou um user com email (linha 3). Mocou o método buscaUsuarioPorEmail que retorna o user criado (linha 4) e fez um assertEquals do que sabemos qual vai ser o retorno. Poderia me explicar o porquê disso? Qual o ganho de criar um teste desse tipo?

    @Test  
    public void testBuscaUsuarioCadastrado() {  
        user.setEmail("efigenia@");       
        when(usuarioDaoMock.buscaUsuarioPorEmail(user)).thenReturn(user);  
        assertEquals(user.getEmail(), usuarioDaoMock.buscaUsuarioPorEmail(user).getEmail());  
    } 

[quote=MPSV]PessoALL gostaria de fazer uma pergunta que deve ser básica para vocês, mas que não entra na minha cabeça.

Por que criar uma método de teste que verifica o resultado do que foi mockado?

Veja o código abaixo. Nunca vai dar erro. Gerou um user com email (linha 3). Mocou o método buscaUsuarioPorEmail que retorna o user criado (linha 4) e fez um assertEquals do que sabemos qual vai ser o retorno. Poderia me explicar o porquê disso? Qual o ganho de criar um teste desse tipo?

    @Test  
    public void testBuscaUsuarioCadastrado() {  
        user.setEmail("efigenia@");       
        when(usuarioDaoMock.buscaUsuarioPorEmail(user)).thenReturn(user);  
        assertEquals(user.getEmail(), usuarioDaoMock.buscaUsuarioPorEmail(user).getEmail());  
    } 

[/quote]

Esse caso especifico nao precisa mesmo. Pra mim só faz sentido por exemplo se “buscarUsuarioPorEmail” lancar alguma excecao ou retornar nulo para que eu possa testar a reação do meu código a esses casos.

Esse exemplo ai nao esta testando o código do cara, esta testando o mockito.