Spring Boot Webアプリケーションでは、MongoDBを使用してデータを保存しています。アプリケーションでは、MongoRepository
を拡張するインターフェイスを使用してデータベースにアクセスします。
このようなリポジトリクラスの単体テストを設定するにはどうすればよいですか?私がしたいのは
Embedded MongoDB を使用してみましたが、ファイルからテストデータを挿入する方法がわかりません。 NoSQLUnit も使用してみましたが、SpringApplicationConfigurationが単体テストの構成と競合し、読み取りと書き込みのデータベースが異なります。
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>
同じ問題に直面し、別の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)
お役に立てば幸いです。
これが私がしたことです。
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