복붙노트

[SPRING] 스프링 부트 응용 프로그램에서 junit 테스트가 임베디드 mongoDB를 사용하도록 만드는 방법은 무엇입니까?

SPRING

스프링 부트 응용 프로그램에서 junit 테스트가 임베디드 mongoDB를 사용하도록 만드는 방법은 무엇입니까?

springboot를 배우고 간단한 springboot 응용 프로그램을 만들었습니다. 나머지 응용 프로그램에 대해 단위 테스트와 외부 mongoDB를 실행할 때 임베디드 mongoDB를 사용하고 싶습니다. 그러나 내장 된 테스트 대신 단위 테스트에 외부 mongoDB를 사용합니다. POM에 다음 두 가지 종속성이 있습니다.

    <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>

내 속성 파일에는 다음이 있습니다.

# MongoDB properties
mongo.db.name=person_testDB
mongo.db.url=localhost

#external Mongo url
spring.data.mongodb.uri=mongodb://localhost:27017/personDB

임베디드 MongoDB 구성을 포함하는 구성 파일 (MongoDBConfig.java)이 있습니다.

@EnableMongoRepositories
public class MongoDBConfig {

@Value("${mongo.db.url}")
private String MONGO_DB_URL;

@Value("${mongo.db.name}")
private String MONGO_DB_NAME;

@Bean
public MongoTemplate mongoTemplate() {
    MongoClient mongoClient = new MongoClient(MONGO_DB_URL);
    MongoTemplate mongoTemplate = new MongoTemplate(mongoClient, MONGO_DB_NAME);
    return mongoTemplate;
 }
}

다음은 PersonService.java 클래스입니다.

@Service
public class PersonService  {
private static final Logger logger = LoggerFactory.getLogger(PersonService.class);      
@Autowired
MongoTemplate mongoTemplate;            
public void savePerson(Person person) {
    String name = person.getName();
    String collectionName = name.substring(0, 1);
        mongoTemplate.save(person, collectionName);
    }               
}

PersonsService 클래스에 대한 내 단위 테스트는 다음과 같습니다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {MongoDBConfig.class})
@SpringBootTest(classes = PersonService.class)
@DataMongoTest
public class PersonServiceTest {

@Autowired
PersonService personService;    
MongodForTestsFactory factory;
MongoClient mongo;

@Before
public void setup() throws Exception {
    factory = MongodForTestsFactory.with(Version.Main.PRODUCTION);
    mongo = factory.newMongo();
}

@After
public void teardown() throws Exception {
    if (factory != null)
        factory.shutdown();
}

@Test
public void testSave(){
Person person = new Person("Bob Smith " , 25);
personService.savePerson(person);
}
}

외부 MongoDB에서 컬렉션 이름과 문서 이름을 올바르게 만듭니다. unitTests를 임베디드 Mongo로 제한하려면 어떻게해야합니까?

해결법

  1. ==============================

    1.대안은 테스트에서 전체 스프링 부트 응용 프로그램을 실행하는 것입니다. 이 경우 스프링 부트 응용 프로그램이 자동으로 감지되고 내장 mongoDB가 스프링 부트에 의해 다운로드되고 시작됩니다.

    대안은 테스트에서 전체 스프링 부트 응용 프로그램을 실행하는 것입니다. 이 경우 스프링 부트 응용 프로그램이 자동으로 감지되고 내장 mongoDB가 스프링 부트에 의해 다운로드되고 시작됩니다.

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

    예제의 경우 다른 포트에서 임베디드 Mongo를 시작하기 위해 코드를 수정할 수 있습니다.

    또 다른 방법은 테스트 @Configuration 클래스의 일부로 MongoRepository를 사용하고 내장 Mongo를 초기화하는 것입니다. 여기에 요약되어 있습니다. Spring Boot 애플리케이션에서 통합 테스트를 위해 Embedded MongDB를 어떻게 구성합니까?

  2. from https://stackoverflow.com/questions/48039644/how-to-make-the-junit-tests-use-the-embedded-mongodb-in-a-springboot-application by cc-by-sa and MIT license