Spring 无法在Junit测试中注入依赖项

Spring 无法在Junit测试中注入依赖项,spring,junit,dependency-injection,Spring,Junit,Dependency Injection,在我的一个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 or

在我的一个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 );

}
package com.mitto.repositories;
导入org.springframework.data.repository.paging和sortingrepository;
导入org.springframework.stereotype.Repository;
导入com.mitto.domain.User;
@存储库
公共接口用户存储库扩展了分页和排序存储库{
用户findByFacebookId(长facebookId);
用户findByAuthToken(字符串令牌);
}

我看不出这有什么问题

有时候,一个有效的示例比修复更好。
以下是一个工作示例:

首先,在您的配置类中

@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引导应用程序只是一个Spring应用程序上下文,因此除了通常使用普通Spring上下文进行测试外,不需要做任何特殊的测试。但是需要注意的一点是,如果使用SpringApplication创建SpringBoot,那么SpringBoot的外部属性、日志记录和其他功能默认情况下只能安装在上下文中

SpringBoot提供了@SpringBootTest注释,当您需要SpringBoot功能时,可以将其用作标准SpringTest@ContextConfiguration注释的替代品。注释的工作原理是通过SpringApplication创建测试中使用的ApplicationContext

有关更多详细信息,请阅读文档:


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

首先,在您的配置类中

@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引导应用程序只是一个Spring应用程序上下文,因此除了通常使用普通Spring上下文进行测试外,不需要做任何特殊的测试。但是需要注意的一点是,如果使用SpringApplication创建SpringBoot,那么SpringBoot的外部属性、日志记录和其他功能默认情况下只能安装在上下文中

SpringBoot提供了@SpringBootTest注释,当您需要SpringBoot功能时,可以将其用作标准SpringTest@ContextConfiguration注释的替代品。注释的工作原理是通过SpringApplication创建测试中使用的ApplicationContext

有关更多详细信息,请阅读文档:


谢谢闵军,这帮助我解决了问题,让我更好地理解。干杯@scottazord
@SpringBootTest
的值为class,指定用于加载ApplicationContext的类。它没有做更多的事情。很高兴它有帮助。谢谢Minjun,这帮助我解决了我的问题,并为我提供了更好的理解。干杯@scottazord
@SpringBootTest
的值为class,指定用于加载ApplicationContext的类。除此之外,它没什么作用。很高兴它起到了作用。