Spring Data - MongoDB - JUnit测试

w8f9ii69  于 2022-10-30  发布在  Spring
关注(0)|答案(4)|浏览(169)

我有一个关于Spring Data 的问题- MongoDB和JUnit测试。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = { UserRepository.class, User.class })
public class MyJUnitTest {

UserRepository如下所示:

@Repository
public interface UserRepository extends MongoRepository<User, String> {
    User findByUsername(final String username);
}

出现以下异常:
无法示例化[....存储库.用户存储库]:指定的类是接口
我现在的问题是,如何实现UserRepository的示例化,尽管没有实现类,因为SpringData是自己实现的?如果我不使用@Repository标记UserRepository,那么Spring就不会创建bean对象
[编辑]
我已经尝试了你发布的链接的例子,如果我在main方法上运行应用程序,它工作得很好。然后我试图实现一个测试类,但在这个例子中,我得到了同样的异常:
创建名为“hello.test. TestClass”的Bean时出错:插入自动连接的依赖项失败;嵌套的异常是一个嵌套的异常。无法自动连接字段:私有hello.客户存储库hello.测试.测试类.存储库;嵌套异常是一个嵌套的异常。没有这样的Bean定义异常:未找到以下依赖关系的[hello.CustomerRepository]类型的合格Bean:至少应有1个符合此依赖关系的自动连接候选项的Bean。依赖关系注解:{@org.springframework.beans.工厂.注解.自动连接(必需=true)}
我的测试类在src/test/java/hello/test中看起来像这样(hello.test是包):

@ComponentScan("hello")
@EnableMongoRepositories(basePackages = "hello")
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = { CustomerRepository.class,     Customer.class })
public class TestClass {

@Autowired
private CustomerRepository repository;

@Test
public void testMethod() {
    System.out.println("repositoryd: " + repository);
    }
}

我的CustomerRepository看起来像这样(带有@Configuration注解):

@Configuration
public interface CustomerRepository extends MongoRepository<Customer, String> {

public Customer findByFirstName(String firstName);

public List<Customer> findByLastName(String lastName);

}

实际上,我不知道我需要哪些注解来运行测试-也许你会有另一个建议,以便我可以解决这个问题。

kx1ctssn

kx1ctssn1#

如果使用junit5,并且希望以尽可能轻量级的方式启动Spring,则需要在IntegrationTest类上使用以下注解

@DataMongoTest
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {MyMongoService.class})
@EnableMongoRepositories(basePackageClasses = MyRepository.class)
public class MyMongoIntegrationTest {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Autowired
    private MyRepository myRepository;

    @Autowired
    private MyMongoService myMongoService; <-- Assuming this injects MyRepository

}
9avjhtql

9avjhtql2#

适用于Spring Boot子1.5.8.RELEASE
您可以使用@SpringBootTest引导所有Spring配置。
您的测试将类似于

@RunWith(SpringRunner.class)
@SpringBootTest
public class SomeRepositoryTests {

    @Autowired
    private SomeRepository someRepository;

    @Test
    public void someTest() {
        someRepository.someMethod(...);
        // assertions
    }
}

当然,您希望使用嵌入式mongodb进行测试,因此添加

for Maven

<dependency>
  <groupId>de.flapdoodle.embed</groupId>
  <artifactId>de.flapdoodle.embed.mongo</artifactId>
  <scope>test</scope>
</dependency>

for Gradle

testCompile('de.flapdoodle.embed:de.flapdoodle.embed.mongo')
kmbjn2e3

kmbjn2e33#

您的repo CustomerRepository不需要@Configuration@Repository注解,Spring会在您扩展基本Repository类时为您做这件事。
要设置Mongo存储库,您需要使用以下注解扩展ApplicationContext

@Configuration
@EnableAutoConfiguration // create MongoTemplate and MongoOperations
@EnableMongoRepositories(basePackages = "hello.test") // Create your repos
public class ApplicationConfig {

}

您还希望使用内存中的数据库进行单元/集成测试,这样它们就不会更改产品数据库。
要启用它,只需添加以下依赖项:

<dependency>
  <groupId>de.flapdoodle.embed</groupId>
  <artifactId>de.flapdoodle.embed.mongo</artifactId>
  <version>1.50.2</version>
  <scope>runtime</scope>
</dependency>

最后,使用ApplicationContext配置测试类

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ApplicationConfig.class)
public class MyJUnitTest {
    // Test cases ...
}
rjzwgtxy

rjzwgtxy4#

@SpringApplicationConfiguration中,你需要指向一个配置类。我假设UserRepositoryUser都不是。
要开始了解Spring和Spring Data MongoDB的基础知识,请务必查看this getting started guide

相关问题