测试期间Bean不是自动装配的(java.lang.NullPointerException)

时间:2017-11-08 11:52:28

标签: java spring javabeans autowired

我的应用程序通常运行正常,但是当我运行测试或通过maven构建应用程序时,应用程序正在关闭具有错误java.lang.NullPointerException的测试。我调试它并发现我的服务层中的bean不是Autowired并且它们是null。 这是我的课程测试:

public class CompanyServiceSimpleTest {
    private CompanyService companyService;

    @Before
    public void setUp() {
        companyService = new CompanyServiceImpl();
    }

    // Here is sample test
    @Test
    public void testNumberOfCompanies() {
        Assert.assertEquals(2, companyService.findAll().size());
    }
}

companyService已初始化,但其中没有bean。这是CompanyServiceImpl:

@Service
public class CompanyServiceImpl implements CompanyService {

    @Autowired
    private CompanyRepository companyRepository; // is null

    @Autowired
    private NotificationService notificationService; // is null

    @Override
    public List<CompanyDto> findAll() {
        List<CompanyEntity> entities = companyRepository.find(0, Integer.MAX_VALUE);
        return entities.stream().map(Translations.COMPANY_DOMAIN_TO_DTO).collect(Collectors.toList());
    }
    // ... some other functions
}

因此,当调用companyRepository.find()时,应用程序崩溃。这是存储库类:

@Repository
@Profile("inMemory")
public class CompanyInMemoryRepository implements CompanyRepository {

    private final List<CompanyEntity> DATA = new ArrayList<>();
    private AtomicLong idGenerator = new AtomicLong(3);

    @Override
    public List<CompanyEntity> find(int offset, int limit) {
        return DATA.subList(offset, Math.min(offset+limit, DATA.size()));
    }
    // ... some others functions
}

我已经为该服务设置了配置文件,但我在Idea中有了VM选项:

  

-Dspring.profiles.active =农业开发,inMemory

所以它应该有效。

2 个答案:

答案 0 :(得分:0)

要进行自动装配工作,必须进行Spring集成测试。您必须使用以下内容来激活测试类:

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = {MyApplicationConfig.class})

如果它是Spring Boot应用程序,例如:

@RunWith(SpringJUnit4ClassRunner.class)@SpringBootTest(classes = {MyApp.class, MyApplicationConfig.class}, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)

有关此主题的更多信息:http://www.baeldung.com/integration-testing-in-springhttp://www.baeldung.com/spring-boot-testing

答案 1 :(得分:0)

您没有在TestClasses中配置Spring,因此无法注入任何东西...... 尝试使用 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "path to your config xml" })

配置您的课程

一个小例子:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:config/applicationContext.xml"})
public class MyTest {

   @Autowired 
   private MyClass myInjectedClass;

   @Test 
   public void someTest() {
     assertNotNull(myInjectedClass);
   }
}