<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 如何對 DAO 組件進行單元測試 > 原文: [https://javatutorial.net/how-to-unit-test-dao-components](https://javatutorial.net/how-to-unit-test-dao-components) 在本教程中,您將學習如何為 DAO 創建單元測試。 前提條件是,您需要具備 DAO 的基本知識。 ![spring-featured-image](https://img.kancloud.cn/64/23/64231db4bf6e880066d0d4c2e31ac166_780x330.jpg) 在測試 DAO 組件時,我們確實有兩種方法。一種是使用模擬框架[`Mockito`](https://site.mockito.org/) ,另一種是創建兩個可以協同工作的類。 在本教程中,我們將使用`Mockito`。 `EmployeeDAO` ```java public class EmployeeDAO implements Dao<Employee> { // will act as a "mini-database" private List<Employee> employees = new ArrayList<>(); private SessionFactory sessFactory; // Constructor public EmployeeDAO(SessionFactory s) { // Populate our list of employees with 3 Demos employees.add(new Employee("Demo1", "Demo1@example.com")); employees.add(new Employee("Demo2", "Demo2@example.com")); employees.add(new Employee("Demo3", "Demo3@example.com")); sessFactory = s; } // Overriding the Dao interface methods @Override public Employee get(long id) { return employees.get((int) id)); } @Override public List<Employee> getAll() { return employees; } @Override public void save(Employee emp) { employees.add(emp); } @Override public void update(Employee employee, String[] params) { // Check for validity if (params[0].length() != 0|| params[1].length() != 0) { // Initialize the employee employee.setName(params[0]); employee.setEmail(params[1]); // Add the Initialized employee to the list of employees (a.k.a. DB) employees.add(employee); } } @Override public void delete(Employee employee) { employees.remove(employee); } } ``` 如果您想知道`Employee`類的外觀,則為: `Employee.java` ```java public class Employee { //members private String name; private String email; // constructor Employee(String n, String e) { name = n; email = e; } // setter methods public void setName(String n) { name = n; } public void setEmail(String e) { email = e; } // getter methods public String getName() { return name; } public String getEmail() { return email; } } ``` 雇員類只是一個標準的構造器/獲取器/設置器方法。 現在是時候為 DAO 類創建測試類了。 `EmployeeDAOTest` ```java @ExtendWith(SpringExtension.class) @Tag("DAO") public class EmployeeDAOTest { @MockBean private SessionFactory sessionFactory; @MockBean private Session session; private EmployeeDAO employeeDAO; @BeforeEach public void prepare() throws Exception { Mockito.when(sessionFactory.getCurrentSession()).thenReturn(session); employeeDAO = new EmployeeDAO(sessionFactory); } @Test public void should_returnNull_ifNonExistent() { Query q = Mockito.mock(Query.class); Mockito.when(session.getNamedQuery("get")).thenReturn(q); Mockito.when(q.getResultList()).thenReturn(new ArrayList()); List l = employeeDAO.getAll(); assertAll("Employees", () -> assertNotEquals(l, null), () -> assertEquals(l.size(), 0)); } } ``` **細分** 在上一課中有兩件事需要分解。 首先,請注意,我們使用的@MockBean 注解只是將模擬對象添加到應用程序上下文中。 這意味著它將替換任何現有的相同類型的 bean。 如果沒有現有的 bean,將創建一個新的 bean。 然后,我們使用`@BeforeEach`注解,該注解將在所有單元測試運行之前執行。 因此,該方法的名稱為`prepare`,我們正在為單元測試準備“環境”。 在`prepare`方法中,我們有兩件事。 由于[`SessionFactory`](https://docs.spring.io/spring-integration/api/org/springframework/integration/file/remote/session/SessionFactory.html)是一個功能接口,因此可以將其用作 lambda 表達式的分配。 我們在`prepare()`方法中使用`Mockito.when`方法。 它用于在調用過程中給出異常的模擬方法。 所以線 ```java Mockito.when(sessionFactory.getCurrentSession()).thenReturn(session); ``` 確實是在說“讓我獲得當前會話,如果沒有異常,請給我返回該會話”。 然后,我們只需將 DAO 實例分配給一個全新的實例: ```java employeeDAO = new EmployeeDAO(sessionFactory); ``` 之后,我們就有了**測試目標**方法,稱為`should_returnNull_ifNonExistent()`,它的名稱如實:返回`null`,如果沒有則返回空的`ArrayList`要返回的列表。 但是在`EmployeeDAO`實現中,我們永遠不會冒**為空**的風險,因為一旦創建`EmployeeDAO()`實例,我們便在列表中添加了三個`Employee`條目: ```java public EmployeeDAO(SessionFactory s) { // Populate our list of employees with 3 Demos employees.add(new Employee("Demo1", "Demo1@example.com")); employees.add(new Employee("Demo2", "Demo2@example.com")); employees.add(new Employee("Demo3", "Demo3@example.com")); sessFactory = s; } ``` 注意方法的**`@Test`注解**。 這指定此方法用于測試目的。 我們在`EmployeeDAO`類中獲得了被我們覆蓋的`get`方法,如果沒有異常,則返回`q`類型的查詢。 然后我們簡單地返回一個新的空數組列表。 之后,我們使用`getAll()`方法至少應返回 3 個條目,然后使用`assertAll()`方法,該方法結合了`assertNotEquals`和`assertEquals`。 這些行: ```java assertAll("Employees", () -> assertNotEquals(l, null), () -> assertEquals(l.size(), 0)); ``` 確實是在說檢查`l`(包含從`getAll()`方法返回的條目的列表)是否為空,并檢查列表的大小是否為 0。如果是,則返回`true`,`assertEquals`的評估結果為`true`。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看