Весеннее тестирование JUnit с аннотацией @Autowired - PullRequest
3 голосов
/ 13 декабря 2011

У меня возникли проблемы с моими тестовыми примерами после того, как я ввел @Autowired в одном из тестируемых классов.

Мой тестовый пример теперь выглядит так:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/applicationContext.xml", "/spring-security.xml"})
public class StudentRepositoryTest extends AbstractDatabaseTestCase {

private StudentRepository studentRepository;
private CompanyRepository companyRepository;
private Student testStudent;
private Company testCompany;

@Before
public void setUp() {
    studentRepository = new StudentRepository();
    studentRepository.setJdbcTemplate(getJdbcTemplate());
    testStudent = Utils.testStudentNoApplication();
}
@Test
....

}

StudentRepository теперь выглядит следующим образом:

@Service
public class StudentRepository extends AbstractRepository<Student> {

...

private PasswordEncoder passwordEncoder;
private MailService mailService;

public StudentRepository() {
    // TODO Auto-generated constructor stub
}

@Autowired 
public StudentRepository(MailService mailService, PasswordEncoder passwordEncoder) {
    this.mailService = mailService;
    this.passwordEncoder = passwordEncoder;
}

Очевидно, этот тестовый случай выиграл´больше не работает.Но какие изменения мне нужно внести в тестовый сценарий, чтобы аннотация @Autowired была выбрана тестовым примером?

РЕДАКТИРОВАТЬ:

Я теперь обновил свой setUp () для этого(Мне нужен кодировщик паролей, чтобы избежать нулевого пароля):

@Before
public void setUp() {
    //studentRepository = new StudentRepository();
    studentRepository = new StudentRepository(mock(MailService.class), ctx.getAutowireCapableBeanFactory().createBean(ShaPasswordEncoder.class));
    studentRepository.setJdbcTemplate(getJdbcTemplate());
    testStudent = Utils.testStudentNoApplication();
}

Мой тестовый сценарий теперь работает нормально, но мой набор тестов завершается ошибкой с NullPointerException.Я предполагаю, что ApplicationContext по какой-то причине не запускается автоматически при запуске testuite?

1 Ответ

3 голосов
/ 13 декабря 2011

Если вы не хотите объявлять StudentRepository в одном из XML-файлов, на которые ссылается @ContextConfiguration, и автоматически подключать его к тесту, вы можете попробовать использовать AutowireCapableBeanFactory следующим образом:

...
public class StudentRepositoryTest extends AbstractDatabaseTestCase {
    ...
    @Autowired ApplicationContext ctx;

    @Before
    public void setUp() {
        studentRepository = ctx.getAutowireCapableBeanFactory()
                               .createBean(StudentRepository.class);
        ...
    }
    ...
}
...