Java MongoDB Test

MongoDB

MongoDB와 관련된 Query, Repository를 테스트

  • junit:4.12
  • spring-boot:2.4.2

기본 구조

/**
 * IN-MOMORY
 */
@RunWith(SpringRunner.class)
@DataMongoTest
public abstract class MongoDbTestSupport {
}
/**
 * `test` profile에 정의된 실제 MongoDB 사용
 */
@RunWith(SpringRunner.class)
@ActiveProfiles("test")
@DataMongoTest
public abstract class MongoDbTestSupport {
}

@DataMongoTest : MongoDB의 컴포넌트들을 중점적으로 테스트할 수 있으며, 기본적으로 in-memory DB를 사용한다. @ActiveProfiles와 같이 Configuration을 정의하면 실제 MongoDB 테스트에 연관된 정보를 활용한다.

따라해보기

Repository

MongoRepository 에서 지원해주는 메소드나, CustomRepository를 통해서 작성한 Query들을 테스트 할 수 있다.

public class AccountTest extends MongoDbTestSupport {

	@Autowired
	AccountRepository accountRepository;

	Account mockAccount;

	String mockAccountId;

	@Before
	public void setUp() {
		mockAccount = accountRepository.save(Account.builder().build());

		mockAccountId = mockAccount.getId();
	}

	@Test
	public void findById_existentAccountId_shouldBeSuccess() {
		/* GIVEN */
		String mockExistentAccountId = mockAccountId;

		/* WHEN */
		Optional<Account> accountOptional = accountRepository.findById(mockExistentAccountId);

		/* THEN */
		assertThat(accountOptional.orElse(null), is(mockAccount));
	}
}

MongoTemplate

MongoTemplate을 의존성 주입받아 Criteria query를 작성하고, 이를 테스트 할 수 있다.

public class AccountTest extends MongoDbTestSupport {

	@Autowired
	MongoTemplate mongoTemplate;

	Account mockAccount;

	String mockAccountId;

	@Before
	public void setUp() {
		mockAccount = accountRepository.save(Account.builder().build());

		mockAccountId = mockAccount.getId();
	}

	@Test
	public void findById_existentAccountId_shouldBeSuccess() {
		/* GIVEN */
		String mockExistentAccountId = mockAccountId;

		/* WHEN */
		Query query = Query.query(
			Criteria.where("_id").is(mockExistentAccountId)
		);
		
		Account account = mongoTemplate.findOne(query, Account.class);
		
		/* THEN */
		assertThat(account, notNullValue());
		assertThat(account, is(mockAccount));
	}
}

Leave a comment