Как использовать FakeMon go и игнорировать соединение сокета MongoDB при тестировании интеграции на уровне контроллера - PullRequest
1 голос
/ 05 августа 2020

Я использую для приложения spring boot 1.5.x. База данных: MON GO

Использование MongoRepository для операций crud.

Ранее в нашем проекте у нас был выделенный экземпляр тестовой базы данных, поэтому мы добавили свойства mongodb для test db в src \ test \ resources \ application.properties.

Теперь у нас нет тестовой базы данных, поэтому мы хотим использовать встроенную / поддельную базу данных для тестирования наших классов Контроллер / Службы / Репозиторий и т. д. c ..

Параметры - встроены mongodb вроде flapdoodle и fon go

Я пробовал 1 решение de.flapdoodle.embed.mon go от SO вопрос использовать flapdoodle

de.flapdoodle.embed.mon go пытается загрузить zip-архив за пределами сети: cannot-to-download-embedded-mongodb-behind-proxy-using-automati c -configuration

Я пробовал fakemon go, но он не работает для модульного и интеграционного тестирования контроллера. Его выбор mon go информация из базы данных test db с использованием application.properties, представленных в test / resources

pom. xml

        <dependency>
            <groupId>com.github.fakemongo</groupId>
            <artifactId>fongo</artifactId>
            <version>${fongo.version}</version>
            <!--<scope>test</scope> -->// not working, if removed it says cannot find mongo
        </dependency>

        <dependency>
            <groupId>com.lordofthejars</groupId>
            <artifactId>nosqlunit-mongodb</artifactId>
            <version>0.7.6</version>
            <scope>test</scope>
        </dependency>

FakeMon go Конфигурация

package com.myapp.config;

import com.github.fakemongo.Fongo;
import com.mongodb.MongoClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.AbstractMongoConfiguration;


@Configuration
@EnableMongoRepositories
public class FakeMongo extends AbstractMongoConfiguration {

    @Override
    protected String getDatabaseName() {
        return "mockDB";
    }

    @Bean
    public MongoClient mongo() {
        Fongo fongo = new Fongo("mockDB");
        return fongo.getMongo();
    }

}

TestFakeMon go Работает. Тест выполнен правильно - Ссылка http://springboot.gluecoders.com/testing-mongodb-springdata.html

package com.myapp.config;

import com.myapp.domain.entitlement.User;
import com.myapp.repository.UserRepository;
import com.lordofthejars.nosqlunit.annotation.UsingDataSet;
import com.lordofthejars.nosqlunit.core.LoadStrategyEnum;
import com.lordofthejars.nosqlunit.mongodb.MongoDbRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

import static com.lordofthejars.nosqlunit.mongodb.MongoDbRule.MongoDbRuleBuilder.newMongoDbRule;
import static org.junit.Assert.assertTrue;

@RunWith(SpringRunner.class)
@Import(value = {FakeMongo.class})
public class TestFakeMongo {

    @Autowired
    private ApplicationContext applicationContext;

    @Rule
    public MongoDbRule embeddedMongoDbRule = newMongoDbRule().defaultSpringMongoDb("mockDB");

    @MockBean
    private UserRepository userRepository;

    @Test
    @UsingDataSet(loadStrategy = LoadStrategyEnum.DELETE_ALL)
    public void getAllUsers_NoUsers() {
        List<User> users = userRepository.findAll();
        assertTrue("users list should be empty", users.isEmpty());
    }
}

UserRepositoryTest - Модульное тестирование для репозитория также работает с использованием fon go Ссылка - http://dontpanic.42.nl/2015/02/in-memory-mongodb-for-unit-and.html

package com.myapp.repository;

import com.myapp.config.SpringUnitTest;
import com.myapp.domain.User;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.*;


public class UserRepositoryTest extends SpringUnitTest {


    @Autowired
    private UserRepository userRepository;


    @Before
    public void setup() {
        importJSON("user", "user/user.json");
    }

    @Test
    //@UsingDataSet(loadStrategy = LoadStrategyEnum.CLEAN_INSERT, locations = "/json-data/user/user.json") // test/resources/..
    public void findUser_should_return_user() {
        User user = userRepository.findByXYZId("XX12345");
        assertNotNull(user);
    }

    @Test
    public void findUser_should_return_null() {
        User user = userRepository.findByXYZId("XX99999");
        assertNull(user);
    }

    @Test
    public void deleteUser_should_return_null() {
        userRepository.delete("XX12345");
        User user = userRepository.findByXYZId("XX12345");
        assertNull(user);
    }

    @Test
    public void saveUser_should_return_user() {
        User user = new User();
        user.setXYZId("XX12345");
        user.setAck(true);
        List<DateTime> dateTimeList = new ArrayList<>();
        dateTimeList.add(DateTime.now(DateTimeZone.UTC));
        user.setAckOn(dateTimeList);
        User dbUser = userRepository.save(user);
        assertEquals(user, dbUser);
    }

    @Test
    public void findAllUser_should_return_users() {
        List<User> userList = userRepository.findAll();
        assertEquals(1, userList.size());
    }
}

Тестирование уровня контроллера не работает .. Ссылка - https://www.paradigmadigital.com/dev/tests-integrados-spring-boot-fongo/

UserControllerTest не удалось java .lang.IllegalStateException: Failed to load ApplicationContext - На этом этапе тестовые mon go db details fetech вместо fon go test \ resources \ application.properties тестовый сервер подробные данные db загружаются

package com.myapp.config;

package com.myapp.controllers;

import com.myapp.config.FakeMongo;
import com.myapp.services.persistance.UserService;
import com.lordofthejars.nosqlunit.mongodb.MongoDbRule;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultMatcher;

import static com.lordofthejars.nosqlunit.mongodb.MongoDbRule.MongoDbRuleBuilder.newMongoDbRule;
import static org.hamcrest.CoreMatchers.containsString;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.content;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@ActiveProfiles("it")
@RunWith(SpringRunner.class)
@SpringBootTest(
    webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
    classes =  Application.class
)
@Import(value = {FakeMongo.class})
@AutoConfigureMockMvc
@TestPropertySource(locations = "classpath:application-it.properties")
public class UserControllerTest {


    @Rule
    public MongoDbRule embeddedMongoDbRule = newMongoDbRule().defaultSpringMongoDb("mockDB");

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private UserService service;

    @Before
    public void setUp() throws Exception {
    }

    @Test
    public void deleteUser() throws Exception {
        Mockito.when(this.service.deleteUser(Mockito.anyString())).thenReturn(true);
        this.mockMvc.perform(delete("/User")).andDo(print()).andExpect(status().isOk())
                .andExpect((ResultMatcher) content().string(containsString("true")));
    }
}

UserControllerTest Не работает, происходит сбой с ошибкой java .lang.IllegalStateException: не удалось загрузить ApplicationContext при попытке подключиться к тестовому экземпляру базы данных mon go с помощью приложения. свойства, присутствующие в test / resources

Оцените рабочий пример использования fakemon go при запуске теста интеграции для уровня контроллера

Какие изменения, мне нужно сделать на уровне кода (класс контроллера или любой другой класс) или application.properties test \ resources?

...