Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为控制器配置测试类以使用嵌入式Mongo?_Java_Spring_Mongodb_Junit - Fatal编程技术网

Java 如何为控制器配置测试类以使用嵌入式Mongo?

Java 如何为控制器配置测试类以使用嵌入式Mongo?,java,spring,mongodb,junit,Java,Spring,Mongodb,Junit,如果我的问题太明显,我道歉,但我对春天还不熟悉。我的应用程序上有两个属性配置文件。一个名为application.properties并具有我的生产数据库的配置设置,另一个名为application test.properties,它存储我运行以测试我的应用程序的嵌入式Mongodb的信息。我还有一个名为ExpertRepository.java的存储库类,如下所示: import org.bson.types.ObjectId; import org.springframework.data.

如果我的问题太明显,我道歉,但我对春天还不熟悉。我的应用程序上有两个属性配置文件。一个名为
application.properties
并具有我的生产数据库的配置设置,另一个名为
application test.properties
,它存储我运行以测试我的应用程序的
嵌入式Mongo
db的信息。我还有一个名为
ExpertRepository.java
的存储库类,如下所示:

import org.bson.types.ObjectId;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface ExpertRepository extends MongoRepository<Experts, String>{
    Experts findBy_id(ObjectId _id);

}
现在我想测试我的控制器类,为此我想使用EmbeddedMongo数据库,这是我为测试目的指定的。这就是我的
ExpertControllerTest.java
类现在的样子:


@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = ExpertController.class)
class ExpertControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper objectMapper;

    @MockBean
    private ExpertRepository expertRepo;


    Experts demoExpert = new Experts(ObjectId.get(),"Steve Jobs", "Enterpreneur",
                                     Availability.BUSY, Language.CHINESE);


    @Test
    public void getExperts() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/experts/")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers.status().isOk());

    }

我如何将这个类与我的嵌入式Mongo连接起来,并用一些数据预填充它以测试我的rest方法?提前感谢您的帮助

这可以通过使用两个数据源来实现,一个用于生产环境,另一个用于测试环境。由于您已经将filename用作application-test.properties,因此需要在运行测试类时将概要文件设置为以编程方式进行测试

如果您使用的是Spring 2.x并包含在gradle中

测试实现“de.flapdoodle.embed:de.flapdoodle.embed.mongo”


您的测试和mongo的测试实例之间的绑定应该是自动的

我从

但是我写了一个测试来证明它是有效的,你不需要任何其他东西,只需要“de.flapdoodle.embed:de.flapdoodle.embed.mongo”依赖项,很好的例子:


@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = ExpertController.class)
class ExpertControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper objectMapper;

    @MockBean
    private ExpertRepository expertRepo;


    Experts demoExpert = new Experts(ObjectId.get(),"Steve Jobs", "Enterpreneur",
                                     Availability.BUSY, Language.CHINESE);


    @Test
    public void getExperts() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/experts/")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers.status().isOk());

    }
@DataMongoTest
public class MongoApplicationTest {

    @Autowired
    protected MongoTemplate mongoTemplate;

    @Test
    public void test1() {
        assertNotNull(mongoTemplate);

        DBObject objectToSave = BasicDBObjectBuilder.start()
                .add("key", "value")
                .get();

        mongoTemplate.save(objectToSave, "collection");

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

}