簡體   English   中英

使用彈簧進行獨立 JUnit 測試 @Autowired

[英]Independent JUnit Tests with Springs @Autowired

作為測試驅動開發的初學者,我剛剛遇到了一個問題。 我的測試 class 開始如下:

@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@DirtiesContext
@ContextConfiguration(locations = {"/web-test.xml"})
public class XXTest {

  @Autowired
  XX xx;

  @Autowired
  HibernateTemplate template;

  @Test
  public void testSetGetXXValue() throws Exception {
    final Map<String, YY> profilMap = new HashMap<String, YY>(2);
    profilMap.put("1", new YY());
    profilMap.put("2", new YY());

    simpleCockpit.setValues(profilMap);

    assertEquals(profilMap, simpleCockpit.getValues());
  }

如您所見,第一個測試方法改變了自動裝配的 XX 類。 這會影響以下所有測試方法,這些測試方法依賴於 XX 具有自動裝配值。

如何從 XX 測試 getter 和 setter 並確保 XX 具有測試方法的 rest 的自動接線值?

想法:

  • 在測試方法結束時重置正確的值。 不好,因為如果 getter / setter 不起作用,這也不起作用。
  • 將第一種測試方法放在測試 class 的末尾。 不好,因為這使得測試依賴於它們的執行順序。
  • 不要測試 XX 的 getter/setter。 不好,因為 getter / setter 必須像每種方法一樣進行測試。

謝謝你的回答。 我很確定這有一個簡單的解決方案..:)

編輯:關於是否單元測試 getter/setter 的問題,我決定這樣做主要是因為http://www.sundog.net/sunblog/posts/should-we-test-getters-and-二傳手/

如果您修改 spring 托管 bean,那么您可以使用@DirtiesContext注釋。 這個注解可以放在測試類和測試方法上!

來自@DirtiesContext Java 文檔:

指示與測試關聯的 {@link org.springframework.context.ApplicationContext ApplicationContext} 是的並且應該關閉的測試注釋:

  • 在當前測試之后,在方法級別聲明時
  • 在當前測試 class 中的每個測試方法之后,當在 class 級別聲明且 class 模式設置為 {@link ClassMode#AFTER_EACH_TEST_METHOD} AFTER
  • 在當前測試 class 之后,在 class 級別聲明且 class 模式設置為 {@link ClassMode#AFTER_CLASS AFTER_CLASS}

甚至在測試驅動開發中(據我了解):僅為具有最低復雜性的東西編寫顯式測試。 所以我從不為 getter 和 setter 寫明確的測試。 我通常有一個檢查一些功能的測試,當這個功能需要 getter 和 setter 時,我編寫了這個 getter 和 setter(此時),並且它們的工作將由我從隱式開始的功能檢查。


特別是在您的情況下:您為什么使用 Spring Bean,為什么不使用使用new創建的“普通”對象。 只要對測試有用,我就使用“普通”類,主要用於簡單測試。 我也使用 Spring Beans 進行“更大”的測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM