【问题标题】:Unable to inject dependency in Junit test无法在 Junit 测试中注入依赖项
【发布时间】:2017-02-10 21:25:37
【问题描述】:

在我的一个 JUnit 测试类中注入依赖项时遇到了一些麻烦。 我相信 TestApplication 不是包扫描或没有被加载。

代码如下:

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

}

我看不出这有什么问题。

【问题讨论】:

    标签: spring junit dependency-injection


    【解决方案1】:

    有时,一个有效的例子比修复更好。
    这是一个工作示例:

    首先,在你的配置类中

    @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 Boot 应用程序只是一个 Spring ApplicationContext,因此除了您通常使用普通 Spring 上下文执行的操作之外,无需做任何特别的事情来测试它。不过要注意的一件事是,如果您使用 SpringApplication 创建它,则默认情况下,Spring Boot 的外部属性、日志记录和其他功能仅安装在上下文中。

    Spring Boot 提供了一个 @SpringBootTest 注解,当您需要 Spring Boot 功能时,它可以作为标准 spring-test @ContextConfiguration 注解的替代品。注释通过 SpringApplication 创建测试中使用的 ApplicationContext 来工作。

    请阅读文档了解更多详情:

    SpringBootTest annotation

    boot-features-testing

    【讨论】:

    • 感谢 Minjun,这帮助我解决了我的问题并为我提供了更好的理解。干杯!
    • @scottazord @SpringBootTest 带有一个类的值,指定使用哪个类来加载 ApplicationContext。它并没有做更多的事情。
    • 很高兴它有帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-05-17
    • 2021-08-11
    • 1970-01-01
    • 2021-12-08
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多