1

I have an experimental Spring Boot Service that uses MongoDB. I've tried to write some unit tests with the 'de.flapdoodle.embed:de.flapdoodle.embed.mongo' dependency. However, the tests are generating an error:

java.lang.IllegalStateException: Failed to load ApplicationContext. 

When running debug level logging the only additional info I see is

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'embeddedMongoServer' defined in class path resource [org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfiguration.class]: Invocation of init method failed; nested exception is java.lang.RuntimeException: Could not start process: <EOF>

Here is the unit test class:

UserRepositoryTest

package com.gitgrub.userservice.repository;

import com.gitgrub.userservice.model.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
import org.springframework.test.context.ActiveProfiles;

import static org.junit.jupiter.api.Assertions.*;

@DataMongoTest
@ActiveProfiles("test")
class UserRepositoryTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    void findByUsername() {
        String testUsername = "testUser";
        User user = new User(testUsername, "test@example.com", "password");
        userRepository.save(user);

        User foundUser = userRepository.findByUsername(testUsername);
        assertNotNull(foundUser);
        assertEquals(testUsername, foundUser.getUsername());
    }

    @Test
    void findByEmail() {
        String testEmail = "test@example.com";
        User user = new User("testUser", testEmail, "password");
        userRepository.save(user);

        User foundUser = userRepository.findByEmail(testEmail);
        assertNotNull(foundUser);
        assertEquals(testEmail, foundUser.getEmail());
    }

    @Test
    void findByUsernameOrEmail() {
        String testUsername = "testUser";
        String testEmail = "test@example.com";
        User user1 = new User(testUsername, "user1@example.com", "password");
        User user2 = new User("user2", testEmail, "password");

        userRepository.save(user1);
        userRepository.save(user2);

        User foundUser1 = userRepository.findByUsernameOrEmail(testUsername, "");
        assertNotNull(foundUser1);
        assertEquals(testUsername, foundUser1.getUsername());

        User foundUser2 = userRepository.findByUsernameOrEmail("", testEmail);
        assertNotNull(foundUser2);
        assertEquals(testEmail, foundUser2.getEmail());
    }
}

Here is the main project interface that's being tested:

UserRepository

/**
 * UserRepository is an interface for a data access object (DAO) that handles User data.
 * It extends MongoRepository to leverage Spring Data MongoDB's functionality,
 * including CRUD operations and database queries.
 *
 * This repository provides methods for finding a user by username, by email,
 * or by either username or email.
 *
 * The repository is used by other components of the application (like services and controllers)
 * to interact with the User data in the database.
 *
 */

package com.gitgrub.userservice.repository;

import com.gitgrub.userservice.model.User;
import org.springframework.data.mongodb.repository.MongoRepository;

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

    User findByEmail(String email);

    User findByUsernameOrEmail(String username, String email);

}
Hofbr
  • 868
  • 9
  • 31
  • Have you tried to Mock the UserRepository? – jundev May 21 '23 at 21:51
  • I haven't wanted to Mock so far. My reasoning is that if my tests are failing because an embedded MongoDB instance can't be started, then even if I mock UserRepository, I might still run into the same problem with other parts of my application that interact with MongoDB. Why do you think I should Mock as opposed to using an embedded version of MongoDB? – Hofbr May 21 '23 at 23:05

0 Answers0