Writing tests for Polyglot Springboot with both JPATest and MongoDB Test

I am setting up a new Springboot 2 application which uses both an MYSQL database and a MongoDB database for Data storage.

I am unable to understand how I can write a class for tests which use both DataJPA and DataMongo.

Setting up queries across the two for real uses was a relatively simple task by using Services which use both JPA Repositories and Mongo Repositories.

When it comes to write test cases, I am able to write tests for just the JPA entities (@DataJPATest) or for just the Mongo entities (@DataMongoTest) with ease using H2 and Embedded Mongo.

It’s not possible to define a test class with both JPA and Mongo annotations because Spring allows only 1 bootstrap.

This is the class from JPA MYSQL:

@Entity
@Data
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Size(max = 255)
    private String name;

    @Size(max = 1000)
    private String description;
}

Classes for Mongo Repos:

@Document
@Data
public class Review {

    @Id
    private String id;

    @Indexed
    private String title;

    private String reviewText;

    private boolean recommended;

    @Indexed
    private Integer productId;

    @DBRef
    private List<Comment> comments;
}

@Document
@Data
public class Comment {

    @Id
    private String id;

    private String title;

    private String commentText;
}

Sample expected tests class:

@RunWith(SpringRunner.class)
@DataJpaTest
@DataMongoTest
public class ReviewRepositoryTests {

    @Autowired
    TestEntityManager entityManager;

Writing a test class with both DataJPA and DataMongo results in this stack error:

java.lang.IllegalStateException: Configuration error: found multiple declarations of @BootstrapWith for test class [xyz.cybersapien.tech.reviews.ReviewRepositoryTests]: [@org.springframework.test.context.BootstrapWith(value=class org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTestContextBootstrapper), @org.springframework.test.context.BootstrapWith(value=class org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTestContextBootstrapper)]

    at org.springframework.test.context.BootstrapUtils.resolveExplicitTestContextBootstrapper(BootstrapUtils.java:166)
    at org.springframework.test.context.BootstrapUtils.resolveTestContextBootstrapper(BootstrapUtils.java:127)
    at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:124)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:151)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:142)

1
Leave a Reply

avatar
1 Comment threads
0 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
1 Comment authors
Jason Recent comment authors
  Subscribe  
newest oldest most voted
Notify of
Jason
Guest

try @SpringBootTest instead of @DataJpaTest and @DataMongoTest

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

    @Autowired
    TestEntityManager entityManager;

Official Spring Boot document –
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html