我有一个Spring Boot应用程序,其中包含一个Spring Data Jpa存储库。我需要围绕该存储库运行单元(或组件?)测试。我对Spring Data Jpa经验不足。
这是我的考试。这很简单,我无法通过。
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import static org.junit.Assert.assertNotNull;
@DataJpaTest
public class FooRepositoryTest {
@Autowired
private FooRepository fooRepo;
@Test
public void notNull(){
assertNotNull(fooRepo);
}
}
这是其他相关的源代码。
import com.fedex.dockmaintenancetool.webservice.types.Foo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface FooRepository extends JpaRepository<Foo, Long> {
}
和
import javax.persistence.Entity;
@Entity
public class Foo {
}
我只是试图将Jpa存储库自动连接到测试中,但我做不到。显然,我误解了Spring Boot的工作原理。但是即使经过一些教程,我也无法弄清楚我所缺少的东西。有人可以帮我吗?
答案 0 :(得分:2)
您缺少@RunWith(SpringRunner.class)
注释,该注释告诉JUnit实际上启动测试的Spring应用程序。
您的测试班级应该看起来像
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.junit4.SpringRunner;
import static org.junit.Assert.assertNotNull;
@RunWith(SpringRunner.class)
@DataJpaTest
public class FooRepositoryTest {
@Autowired
private FooRepository fooRepo;
@Test
public void notNull(){
assertNotNull(fooRepo);
}
}
问题中使用的JUnit版本仍然是JUnit 4。 Spring Boot 2.2.0切换到JUnit5。
使用JUnit5,您将不得不使用@ExtendWith(SpringExtension.class)
而不是@RunWith(SpringRunner.class)
。
答案 1 :(得分:1)
使用注释@DataJpaTest
时,这意味着您尝试仅测试存储库层。该批注用于测试JPA存储库,并与@RunWith(SpringRunner.class)
结合使用,以填充应用程序上下文。 @DataJpaTest
注释会禁用完全自动配置,并且仅应用与JPA测试相关的配置。因此@fap siggested可以像这样使用它:
@RunWith(SpringRunner.class)
@DataJpaTest
public class FooRepositoryTest {
@Autowired
private FooRepository fooRepo;
@Test
public void notNull(){
assertNotNull(fooRepo);
}
}
当您使用注释@RunWith(SpringRunner.class)
时,SpringRunner支持加载Spring ApplicationContext并将bean @Autowired
放入测试实例。