Teste unitário do DAO, usando o GUICE, Vraptor e Mockito

Pessoal, alguém tem um projeto bacana de testes unitários para compartilhar ?
Estou com algumas dúvidas e queria tirar aqui.

Primeiro. Tenho as seguintes classes.

[code]public abstract class AbstractDAO implements IDAO {

@Inject
Session session;
    ...

}
[/code]

[code]@Component
public class HospitalDAO extends AbstractDAO {

@Override
public Class<Hospital> getEntityClass() {
	return Hospital.class;
}

}[/code]

[code]public class HospitalDAOTest {

@Mock
HospitalDAO dao;

@Before
public void init() {
	MockitoAnnotations.initMocks(this);
}
    ...[/code]

Após o @Before eu tenho o dao, mas com a session null. Qual seria a melhor forma de ter a sessão nesse caso ?
Teria que usar um when(dao.getSession()).return(session) e fazer um @Mock da Session ? Não entendo muito bem porque o Mock já não injeta a session pra mim.

Segundo. Como eu faço para usar um hibernate.cfg.xml no test. Tem como ? Ai eu usaria um igual ao da aplicação mas com a base trocada. Qual a melhor forma de fazer isso ? Posso alterar somente a string de conexão no meu TestSuite?

Valeu.

Se vc mockou o DAO, vc não precisa se preocupar com a Session, pq ele não vai executar os métodos reais.

para um @Mock o objeto não vai ter comportamento nenhum, vc tem que prover o comportamento desejado para o teste.

Mas vc só vai fazer isso nos testes das classes que usam o DAO. No teste do DAO vc não vai mockar o DAO.

O ideal é receber a session no construtor do DAO, daí vc pode passar uma session controlada pra ele.

Segundo: só use o hibernate.cfg.xml de teste nos testes dos daos. E para usar, crie um arquivo hibernate.cfg.test.xml e carregue-o usando a API do Hibernate (crie a sessionFactory e a Session a partir dela)

Pô, brigadão pela resposta. Mas então minha classe que antes tava linda…

@Inject
Session session.

Com construtor vazio (sem construtor definido), vai ter que ser modificada ?
Valeu.

Porque na verdade o código abaixo, ficava so na classe Abstrata, se eu tiver que passar no construtor, vou ter que criar o construtor em todos os DAOs. Isso é triste, hahahaha.

@Inject Session session

E agora vou ter que mudar todo o meu código pra fazer os testes.

se vc preferir setar a session via reflection nos testes, não precisa criar o construtor.

Como seria isso ?
Valeu.

no @Before do teste:

HospitalDAO dao = new HospitalDAO();

Session session = // cria a session usando o cfg de test

new Mirror().on(dao).set().field("session").withValue(session);

Cara, você é foda! Valeu.