스프링 부트 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
'programing' 카테고리의 다른 글
LogStash에서의 JSON 사용 (0) | 2023.03.21 |
---|---|
액션 컨트롤러:알 수 없는 형식 (0) | 2023.03.21 |
스프링 - 여러 스프링 데이터 모듈이 발견되어 엄격한 저장소 구성 모드로 들어갑니다. (0) | 2023.03.21 |
Amazon Cloudfront 비용을 절감하는 방법 (0) | 2023.03.21 |
고급 사용자 지정 필드를 표시하는 JSON API - WordPress (0) | 2023.03.21 |