মেমরি এবং পরীক্ষার ভিত্তি

এবং এখন সবচেয়ে আকর্ষণীয়। হাইবারনেট কোড পরীক্ষা করার সময়, আপনি প্রায়শই একটি বাস্তব বেস দিয়ে কাজ করতে চান না, তবে এমন কিছু স্টাবের সাথে কাজ করতে চান যা ন্যূনতম কার্যকারিতা প্রয়োগ করে।

আপনি কি এমন একটি স্টাব কল্পনা করতে পারেন যা বেশিরভাগ এসকিউএল সার্ভার মান প্রয়োগ করে? আমি না. যাইহোক, ইন-মেমরি ডাটাবেস যেমন চমৎকার. এটি মোটামুটি এই মত কাজ করে:

  • @BeforeAll পদ্ধতিতে, আমরা ইন-মেমরি ডাটাবেস সংযোগ শুরু করি।
  • @BeforeEach পদ্ধতিতে, আমরা সেশন পাই এবং একটি লেনদেন খুলি।
  • @Test পদ্ধতিতে, আমরা বর্তমান সেশন এবং লেনদেনের সাথে কাজ করি।
  • @AfterEach পদ্ধতিতে, আমরা লেনদেন করি।
  • এবং অবশেষে, আফটারঅল পদ্ধতিতে, আমরা ডাটাবেসের সাথে সংযোগ বন্ধ করি।

পরীক্ষার জন্য প্রস্তুতি কেমন দেখায় তা এখানে:

@Test
public class HelloTest {
  private static SessionFactory sessionFactory = null;
  private Session session = null;

  @BeforeAll
  static void setup(){
    try {
  	StandardServiceRegistry standardRegistry  = new StandardServiceRegistryBuilder()
      	.configure("hibernate-test.cfg.xml").build();

  	Metadata metadata = new MetadataSources(standardRegistry)
      	.addAnnotatedClass(Employee.class)
      	.getMetadataBuilder()
      	.build();

      sessionFactory = metadata.getSessionFactoryBuilder().build();

    } catch (Throwable ex) {
        throw new ExceptionInInitializerError(ex);
    }
  }

  @BeforeEach
  void setupThis(){
      session = sessionFactory.openSession();
      session.beginTransaction();
  }

  @AfterEach
  void tearThis(){
      session.getTransaction().commit();
  }

  @AfterAll
  static void tear(){
      sessionFactory.close();
  }

এবং হাইবারনেটের কাজের সাথে পরীক্ষাটি নিজেই দেখতে কেমন লাগে:

@Test
public class HelloTest {

  @Test
  void createSessionFactoryWithXML() {
       Employee emp = new Employee();
       emp.setEmail("demo-user@mail.com");
       emp.setFirstName("demo");
       emp.setLastName("user");

       Assertions.assertNull(emp.getEmployeeId());
       session.persist(emp);
       Assertions.assertNotNull(emp.getEmployeeId());
  }
}

পরীক্ষার তথ্য

এছাড়াও আপনি পরীক্ষার ডেটা দিয়ে আপনার পরীক্ষার ডাটাবেস তৈরি করতে পারেন।

সাধারণত এর জন্য দুটি sql ফাইল তৈরি করা হয়:

  • schema.sql-এ একটি স্ক্রিপ্ট রয়েছে যা ডাটাবেসে টেবিল তৈরি করে
  • test-data.sql-এ একটি স্ক্রিপ্ট রয়েছে যা টেস্ট ডেটা সহ টেবিলগুলিকে পপুলেট করে

টেবিল তৈরি এবং পরীক্ষার ডেটা সাধারণত বিভিন্ন ফাইলে বিভক্ত করা হয়, যেহেতু বিভিন্ন পরীক্ষার গোষ্ঠীর জন্য তাদের নিজস্ব পরীক্ষার ডেটা প্রায় সবসময়ই উপস্থিত হয়।

এই ফাইলগুলি চালানো এই মত দেখায়:

void runSqlScriptFile(String filePath){
  	String sqlScript = new String( Files.readAllBytes(Paths.get(filePath)) );
  	Session session = sessionFactory.openSession();
      Query query = session.createNativeQuery("BEGIN " + sqlScript + " END;");
      query.executeUpdate()
}

এবং আপনার সেটআপ পদ্ধতি কিছুটা পরিবর্তন হবে:

@BeforeAll
static void setup(){
  try {
	StandardServiceRegistry standardRegistry  = new StandardServiceRegistryBuilder()
    	.configure("hibernate-test.cfg.xml").build();

	Metadata metadata = new MetadataSources(standardRegistry)
    	.addAnnotatedClass(Employee.class)
    	.getMetadataBuilder()
    	.build();

	sessionFactory = metadata.getSessionFactoryBuilder().build();
	runSqlScriptFile(“scema.sql”);
	runSqlScriptFile(“test-data.sql”);

  } catch (Throwable ex) {
      throw new ExceptionInInitializerError(ex);
  }
}