web-dev-qa-db-ja.com

Spring Boot MongoRepositoryをユニットテストする方法は?

Spring Boot Webアプリケーションでは、MongoDBを使用してデータを保存しています。アプリケーションでは、MongoRepositoryを拡張するインターフェイスを使用してデータベースにアクセスします。

このようなリポジトリクラスの単体テストを設定するにはどうすればよいですか?私がしたいのは

  • mongoDBの組み込み/メモリ内インスタンスを開始します
  • jSONまたはXMLからテストデータを挿入します
  • 自動配線されたリポジトリを使用して、テストデータに対してクエリを実行します

Embedded MongoDB を使用してみましたが、ファイルからテストデータを挿入する方法がわかりません。 NoSQLUnit も使用してみましたが、SpringApplicationConfigurationが単体テストの構成と競合し、読み取りと書き込みのデータベースが異なります。

14
Johanneke

2018およびSpringBoot 2の更新。まず、 documentation に従って、組み込みデータベースとのデータのみの統合テストを行うことができます。これは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>
4

同じ問題に直面し、別のMongoConfigurationクラスを使用して、テスト用の特定の構成を指定しました。

次のようにEmbeddedMongoBuilderを使用して、埋め込み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)

お役に立てば幸いです。

2
afraisse

これが私がしたことです。

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

}

これがjunitです

@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("[email protected]");
        user.setPhoneNumber("1234567890");

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

    @Test
    public void test2() {
        List<Users> persistedUser = userRepository.findAll();
        assertEquals("[email protected]", persistedUser.get(0).getEmailId());
    }
}

このリンクは私が実装するのに役立ちました https://dzone.com/articles/spring-integration-tests

0
Pradeep Sreeram