programing

스프링 부트 Mongo Repository 유닛 테스트 방법

css3 2023. 3. 21. 22:27

스프링 부트 Mongo Repository 유닛 테스트 방법

Spring Boot 웹 어플리케이션에서 데이터를 저장하기 위해 MongoDB를 사용합니다.응용 프로그램에서 확장 인터페이스를 사용하여 데이터베이스에 액세스합니다.MongoRepository.

이러한 저장소 클래스의 유닛 테스트를 설정하려면 어떻게 해야 합니까?제가 하고 싶은 건

  • MongoDB의 내장 메모리 인스턴스를 기동하다
  • JSON 또는 XML에서 테스트 데이터 삽입
  • 자동 전원 저장소를 사용하여 테스트 데이터에 대한 쿼리를 수행합니다.

Embedded MongoDB를 사용해 봤는데 파일에서 테스트 데이터를 삽입하는 방법을 알 수 없습니다.NoSQ도 사용해 보았습니다.LUnit이지만 Spring Application Configuration이 장치 테스트 구성과 충돌하여 읽기 및 쓰기용 데이터베이스가 서로 다릅니다.

Spring Boot에서 @DataMongoTest를 사용하면 됩니다.

@RunWith(SpringRunner.class)
@DataMongoTest
public class FooRepositoryTest {

    @Autowired
    FooRepository fooRepository;

    @Before
    public void setUp() throws Exception {
        fooRepository.save(new Foo());
    }

    @Test
    public void shouldBeNotEmpty() {
        assertThat(fooRepository.findAll()).isNotEmpty();
    }
}

의존 관계

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
    <groupId>de.flapdoodle.embed</groupId>
    <artifactId>de.flapdoodle.embed.mongo</artifactId>
    <scope>test</scope>
</dependency>

2018 및 Spring Boot 2 업데이트입니다.먼저 설명서에 따라 임베디드 DB를 사용하여 데이터 통합 테스트를 수행할 수 있습니다.이 명령어는DataMongoTest주석입니다.mongoDB 테스트를 가능하게 하기 위해 필요한 의존관계만 설정합니다.

완전한 통합 테스트를 수행할 경우AutoConfigureDataMongo주석 대신:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@AutoConfigureDataMongo
public class PriceApiControllerIT {

에 필요한 의존관계pom.xml:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>de.flapdoodle.embed</groupId>
        <artifactId>de.flapdoodle.embed.mongo</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

이게 내가 한 일이야.

public interface UserRepository extends MongoRepository<Users, Long> {

    public void deleteByUserId(String userId);

    public List<Users> findAllByUserStatus(String userStatus);
}

@Document
public class Users {

    @Id
    private long id;

    @Transient
    public static final String SEQUENCE_NAME = "users_sequence";

    @Indexed
    @NotNull
    private String userId;

    private String firstName;
    private String lastName;
    private String userType;
    private String userStatus;

    @Email
    private String emailId;

    @Size(min = 10, max = 10)
    @NumberFormat
    private String phoneNumber;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getUserType() {
        return userType;
    }

    public void setUserType(String userType) {
        this.userType = userType;
    }

    public String getEmailId() {
        return emailId;
    }

    public void setEmailId(String emailId) {
        this.emailId = emailId;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public static String getSequenceName() {
        return SEQUENCE_NAME;
    }

    public String getUserStatus() {
        return userStatus;
    }

    public void setUserStatus(String userStatus) {
        this.userStatus = userStatus;
    }

}

여기 있습니다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MockodsApplication.class)
@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerIT {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    MongoTemplate mongoTemplate;

    @Autowired
    private MockMvc mvc;

    @After
    public void tearDown() {

    }

    @Test
    public void test1() {
        Users user = new Users();
        long userId = 1L;
        user.setId(userId);
        user.setFirstName("FirstName");
        user.setLastName("FirstName");
        user.setEmailId("fisrtname.secondname@gmail.com");
        user.setPhoneNumber("1234567890");

        assertEquals(user, userRepository.save(user));
    }

    @Test
    public void test2() {
        List<Users> persistedUser = userRepository.findAll();
        assertEquals("fisrtname.secondname@gmail.com", persistedUser.get(0).getEmailId());
    }
}

이 링크는 https://dzone.com/articles/spring-integration-tests를 구현하는 데 도움이 되었습니다.

같은 문제에 직면하여 개별 Mongo Configuration 클래스를 사용하여 테스트의 특정 설정을 지정했습니다.

Embedded Mongo Builder를 사용하면 다음과 같이 임베디드 Mongo 인스턴스를 만들 수 있습니다.

import com.mongodb.Mongo;
import cz.jirutka.spring.embedmongo.EmbeddedMongoBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;
import java.net.ServerSocket;

@Configuration
public class MongoConfiguration {

    @Bean
    public Mongo mongo() throws IOException {
        System.setProperty("DB.TRACE","true");
        return new EmbeddedMongoBuilder()
            .version("2.13.1")
            .bindIp("127.0.0.1")
            .port(allocateRandomPort())
            .build();
    }
}

그런 다음 테스트 클래스에서 특정 설정을 @Import 주석과 함께 사용하도록 지정합니다.

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@Import(MongoConfiguration.class)

도움이 됐으면 좋겠다.

https://mongoUnit.org 를 확인해 주세요.

해당 문서에서:

지속성을 위해 MongoDB를 사용하는 Spring Boot 기반 애플리케이션을 위한 데이터 기반 통합 테스트 프레임워크입니다.이 프레임워크를 통해 개발자는 데이터 액세스 로직을 비교적 쉽게 테스트할 수 있습니다.

먼저 다음 Spring Boot 부모를 프로젝트에 추가했는지 확인합니다.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.2.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

Spring Boot 부모를 추가했기 때문에 버전을 지정하지 않고 필요한 의존관계를 추가할 수 있습니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

spring-boot-starter-data-mongodb는 MongoDB에 대한 스프링 지원을 활성화합니다.

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

de.flapdoodle.embed.mongo는 통합 테스트용 내장 MongoDB를 제공합니다.

de.flapdoodle.embed.mongo 의존관계 추가 후 스프링부트는 테스트 실행 시 내장된 MongoDB 다운로드 및 시작을 자동으로 시도합니다.다음 스니펫은 임베디드 MongoDB 인스턴스를 수동으로 구성하는 방법을 보여 줍니다.

class EmbeddedMongoDbIntegrationTest {
    private MongodExecutable mongodExecutable;
    private MongoTemplate mongoTemplate;

    @After
    void clean() {
        mongodExecutable.stop();
    }

    @Before
    void setup() throws Exception {
        String ip = "localhost";
        int port = 27017;

        IMongodConfig mongodConfig = new MongodConfigBuilder().version(Version.Main.PRODUCTION)
            .net(new Net(ip, port, Network.localhostIsIPv6()))
            .build();

        MongodStarter starter = MongodStarter.getDefaultInstance();
        mongodExecutable = starter.prepare(mongodConfig);
        mongodExecutable.start();
        mongoTemplate = new MongoTemplate(new MongoClient(ip, port), "test");
    }

    @Test
    void test() throws Exception {
        // given
        DBObject objectToSave = BasicDBObjectBuilder.start()
            .add("key", "value")
            .get();

        // when
        mongoTemplate.save(objectToSave, "collection");

        // then
        assertThat(mongoTemplate.findAll(DBObject.class, "collection")).extracting("key")
            .containsOnly("value");
    }
}

수동으로 구성된 임베디드 데이터베이스를 사용하도록 구성된 MongoTemplate bean을 빠르게 생성하여 Spring 컨테이너에 등록할 수 있으므로 mongo 저장소도 이 mongoTemplate를 활용하기 시작합니다.

언급URL : https://stackoverflow.com/questions/31970690/how-to-unit-test-a-spring-boot-mongorepository