Giriş
- Bu kullanım Spring'in @DynamicPropertySource anotasyonunu kullanmadığı için daha çok Spring kullanmayan ama Jupiter ile birim testi yapmak isteyen projeler için daha uygun
- TestContainer başlatıldıktan sonra url, username gibi şeyler System property olarak atanıyor. Böylece spring bunlara erişebiliyor.
Şöyle yaparız
import org.testcontainers.containers.OracleContainer;public class OracleTestContainer extends OracleContainer {public static final String DB_CONNECTION_URL = "DB_URL";public static final String DB_USERNAME = "DB_USERNAME";public static final String DB_PASSWORD = "DB_PASSWORD";private static final String IMAGE_VERSION = "oracleinanutshell/oracle-xe-11g:1.0.0";private static OracleTestContainer container;private OracleTestContainer() {super(IMAGE_VERSION);}public static OracleTestContainer getInstance(String initScriptPath) {if (container == null) {container = new OracleTestContainer();container.withInitScript(initScriptPath);container.start();}return container;}@Overridepublic void start() {super.start();System.setProperty(DB_CONNECTION_URL, container.getJdbcUrl());System.setProperty(DB_USERNAME, container.getUsername());System.setProperty(DB_PASSWORD, container.getPassword());}}
Testlerde kullanılacak bir SpringConfig sınıfı tanımlanır. Şöyle yaparız
@ComponentScan(basePackages = {"com.test.app"})
@EnableJpaRepositories(basePackages = "com.test.app")
@EntityScan(basePackageClasses = {RocApplicant.class, ... })
public class ApplicantTestConfig {
}Soyut bir test sınıfı yaratılır. Şöyle yaparız
@ActiveProfiles("test")
@DataJpaTest
@ContextConfiguration(classes = {ApplicantTestConfig.class})
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Rollback(false)
@EnableAutoConfiguration
public abstract class AbstractTest {
  public static final String INIT_SCRIPT = "sql/test-container-init.sql";
  public static OracleContainer oracle = OracleTestContainer.getInstance(INIT_SCRIPT);
  @BeforeAll
  static void setUp() {
    if (!oracle.isCreated()) {
      oracle.start();
    }
  }
}Spring'in bağlanabilmesi için application-test.yaml dosyası oluşturulur. Şöyle yaparız
spring:
  datasource:
    driverClassName: oracle.jdbc.OracleDriver
    url: ${DB_URL}
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}
    hikari:
      maximum-pool-size: 2
  test:
    database:
      replace: none
  main:
    allow-bean-definition-overriding: true
  jpa:
    hibernate:
      ddl-auto: none
      database-platform: org.hibernate.dialect.Oracle10gDialecttest sınıfı şöyledir. Burada ilk sql veri tabanını temizler, ikincisi ise doldurur.
class RocApplicantServiceTest extends AbstractTest {
    
  @Autowired
  RocApplicantService mnsRocApplicantService;
  @Test
  @Sql(value = {"classpath:/sql/clean_roc_applicants.sql",
                "classpath:/sql/insert_roc_applicants.sql"})
  void createApplicant() {
    var response = mnsRocApplicantService.createApplicant(...);
    assertNotNull(response);
  }
}
 
Hiç yorum yok:
Yorum Gönder