2015-12-10 35 views
0

我正在爲小型系統編寫核心服務。有一個用戶可以請求密碼重置的用例。這意味着隨機值通過電子郵件發送給他。我想測試這個案例的整個流程(除了發送和閱讀電子郵件),但我不得不從核心泄漏這個值,我不能這樣做。密碼重置功能的端到端測試

看來唯一正確的做法是用單一方法創建一個@Component,如getRandomString(),然後模擬它。但它似乎有點過分。有沒有更好的方法來做到這一點?

編輯:我想測試的不是郵件是否包含正確的數字。重置密碼的工作原理是這樣的:用戶提供電子郵件,一些隨機生成的數字(實際上是一個相當長的令牌被返回,但想法保持不變)被生成併發送到該電子郵件,之後該令牌必須輸入到某個頁面上點擊提供的鏈接,複製和粘貼,任何常用程序)以及新密碼。我的代碼檢查我們是否知道該令牌,如果是,我們將用戶密碼更改爲新密碼。我想用一個註釋爲@Test的單一方法來測試整個過程 - 發送和接收電子郵件將被嘲笑,我認爲這是我可以獲得這個價值的地方。

+0

你能分享一些代碼,所以我們有一個參考框架嗎? – Mureinik

+2

也許,在這種情況下,問題可能是「數字爲什麼重要」?你想測試什麼?帶有包含隨機數的文本的郵件將被刪除。難道你不能簡單地在不知道隨機數的情況下進行測試,例如通過對正則表達式測試郵件文本?實際上是否需要您知道哪個號碼出來,或者您是否需要檢查號碼出來? –

+0

@FlorianSchaetz我已編輯我的問題來解決您的問題。 –

回答

0

評論部分有一些很好的建議。因此,我想分開以下幾個方面至少:

1)實現你的場景:

弗洛裏安Schaetz的的觀點是現貨上,去爲可能是最簡單的解決方案。除非您絕對需要內容中的特定值,否則只需使用生成的網址即可完成。

Raedwald也有一個健康的建議。需要驗證多個裏面的東西一個測試通常是一個跡象,它應該分成幾個部分來檢查每個對應的功能,否則你最終建立一個god object

2)嚴格有關嘲諷:

Mockito有a few limitations,大部分時間可以結合powermock來克服。對於你的集成測試,你應該能夠mock the creation of your random class所以你可以控制它返回的內容:

@RunWith(PowerMockRunner.class) // delegate test running to Powermock so it can work its magic 
@PrepareForTest({RandomMockeryTest.ClassUsingRandom.class}) // define classes which powermock should manipulate 
public class RandomMockeryTest { 

    private Random mockedRandom; 

    @Before 
    public void setUp() throws Exception { 
     // mock Random 
     mockedRandom = PowerMockito.mock(Random.class); 

     // make it return 100, waaay bigger than 10, isn't it?! 
     PowerMockito.doReturn(100).when(mockedRandom).nextInt(Mockito.anyInt()); 

     // whenever a new Random instance is created, make sure to return our mock 
     PowerMockito.whenNew(Random.class).withNoArguments().thenReturn(mockedRandom); 
    } 

    @Test 
    public void testSomethingRandom() { 
     // instantiate the class under test 
     ClassUsingRandom classUsingRandom = new ClassUsingRandom(); 

     // call the method and make sure it returns the expected value 
     assertEquals(100, classUsingRandom.giveMeARandomValue()); 
    } 

    public static class ClassUsingRandom { 
     public int giveMeARandomValue() { 
      // this should return an int between 0 and 10, not even close to 100 
      return new Random().nextInt(10); 
     } 
    } 
} 
0

您不需要首尾測試完整功能。使用低級別測試來測試低級別組件的功能是否正常。然後使用一些更高級別(集成)端到端測試來檢查低級別組件是否正確連接到彼此。

+0

這當然回答了當前標題的問題,但它並沒有回答我原來的問題,因爲我沒有問過關於測試整個功能性,我一直在問關於嘲笑使用更深的內部代碼的隨機數生成器問題的方法。 –