2016-10-03 5 views
0

Имея некоторые проблемы с инъекцией зависимости в одном из моих тестовых классов JUnit. Я считаю, что TestApplication не сканирует пакет или не загружается.Невозможно ввести зависимость в тест Junit

код ниже:

package com.mitto.repositories; 

import static org.junit.Assert.*; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.TestExecutionListeners; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; 
import org.springframework.test.context.transaction.TransactionalTestExecutionListener; 

import com.github.springtestdbunit.DbUnitTestExecutionListener; 
import com.github.springtestdbunit.annotation.DatabaseSetup; 
import com.mitto.MittoApplicationTests; 
import com.mitto.domain.User; 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes= { MittoApplicationTests.class }) 
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class, 
    TransactionalTestExecutionListener.class, 
    DbUnitTestExecutionListener.class}) 
@DatabaseSetup("UserRepositoryTest.xml") 
public class UserRepositoryTest { 

    @Autowired 
    UserRepository repository; 

    private static final long FACEBOOK_ID = 1234567; 

    @Test 
    public void getUserById() { 
     User user = repository.findOne(1L); 
     assertNotNull(user); 
     assertEquals(user.getFacebookId(), FACEBOOK_ID ); 
    } 
} 

MittoApplicationTests.java

package com.mitto; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.boot.test.context.SpringBootTest; 
import org.springframework.test.context.junit4.SpringRunner; 

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class MittoApplicationTests { 

    @Test 
    public void contextLoads() { 
    }  
} 

UserRepository.java

package com.mitto.repositories; 

import org.springframework.data.repository.PagingAndSortingRepository; 
import org.springframework.stereotype.Repository; 

import com.mitto.domain.User; 

@Repository 
public interface UserRepository extends PagingAndSortingRepository<User, Long>{ 

    User findByFacebookId(long facebookId); 
    User findByAuthToken(String token); 

} 

Я не вижу ничего плохого в этом.

ответ

2

Иногда рабочий пример лучше, чем исправления.
Вот рабочий пример:

Во-первых, в своем классе конфигурации

@SpringBootApplication 
@ComponentScan(value = "com.mitto") 
@EnableJpaRepositories(value = "com.mitto") 
@EntityScan(basePackages = {"com.mitto.domain"}, basePackageClasses = {Jsr310JpaConverters.class}) 
public class MittoApplicationTests { 
} 

Во-вторых, в тестовом классе

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringBootTest(classes = MittoApplicationTests.class) // replace the @ContextConfiguration with @SpringBootTest 
// rest of of your annotations ... 
public class UserRepositoryTest { 
    @Autowired 
    UserRepository repository; 

    // your test cases 
} 

Весеннее загрузки приложения просто Spring ApplicationContext, поэтому ничего особенного не нужно делать, чтобы протестировать его за пределами того, что вы обычно делаете с весенним контекстом ванили. Одна вещь, о которой нужно помнить, заключается в том, что внешние свойства, протоколирование и другие функции Spring Boot устанавливаются только в контексте по умолчанию, если вы используете SpringApplication для его создания.

Spring Boot предоставляет аннотацию @SpringBootTest, которая может использоваться как альтернатива стандартной аннотации весеннего теста @ContextConfiguration, когда вам нужны функции Spring Boot. Аннотация работает, создавая ApplicationContext, используемый в ваших тестах с помощью SpringApplication.

Пожалуйста, прочитайте документацию для получения более подробной информации:

SpringBootTest annotation

boot-features-testing

+0

Благодаря Minjun, это помогло мне решить мою проблему и обеспечить лучше понять для меня. Ура! – scottazord

+0

@scottazord '@ SpringBootTest' со значением класса указывает, какой класс использовать для загрузки ApplicationContext. Это не намного больше. –

+0

Рад, что это помогло. –

Смежные вопросы