Duvida Mockito + coverage

10 respostas
L

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.

10 Respostas

C

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?

L

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.

E

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.

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.

L

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:

R

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.

L

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

E

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.

L

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,


M

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());  
    }
Y

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());  
    }

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.

Criado 23 de fevereiro de 2011
Ultima resposta 16 de abr. de 2013
Respostas 10
Participantes 6