无法在Junit测试

时间:2016-10-03 00:14:50

标签: spring junit dependency-injection

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

}

我无法看到这个问题。

1 个答案:

答案 0 :(得分: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 Boot应用程序只是一个Spring ApplicationContext,因此除了通常使用的Spring上下文之外,还没有什么特别的东西可以用来测试它。需要注意的一点是,如果使用SpringApplication创建Spring Boot的外部属性,日志记录和其他功能,则默认情况下只会在上下文中安装。

     

Spring Boot提供@SpringBootTest注释,当您需要Spring Boot功能时,它可用作标准spring-test @ContextConfiguration注释的替代方法。注释的工作原理是通过SpringApplication创建测试中使用的ApplicationContext。

请阅读文档以获取更多详细信息:

SpringBootTest annotation

boot-features-testing