密码重置功能的端到端测试

时间:2015-12-10 08:24:39

标签: spring testing junit

我正在为一个小型系统编写核心服务。有一个用户可以请求密码重置的用例。这意味着通过电子邮件将随机值发送给他。我想测试一下这个案例的整个流程(发送和阅读电子邮件除外),但我不得不从核心泄漏这个值,我不能这样做。

似乎正确执行此操作的唯一方法是使用单个方法创建@Component,例如getRandomString()并模拟它。但似乎有点过分。有没有更好的方法呢?

编辑:我要测试的不是邮件是否包含正确的号码。重置密码的工作方式如下:用户提供电子邮件,生成一些随机生成的数字(实际上返回了一个很长的令牌,但想法保持不变)生成并发送到此电子邮件,之后必须在某个页面上输入此令牌(通过点击提供的链接,复制和粘贴,无论什么,常见的程序)以及新密码。我的代码检查我们是否知道此令牌,如果是,我们将用户的密码更改为新密码。我想在一个用@Test注释的方法中测试整个过程 - 发送和接收电子邮件将被模拟,我认为这是我可以获得此值的地方。

2 个答案:

答案 0 :(得分:0)

您无需端到端测试完整功能。使用低级测试来正确测试低级组件的功能。然后使用一些更高级别(集成)的端到端测试来检查低级组件是否正确连接到彼此。

答案 1 :(得分:0)

评论部分提出了一些很好的建议。因此,我至少将以下几个方面分开:

1)实施您的方案:

Florian Schaetz的观点是现实,尽可能找到最简单的解决方案。除非您绝对需要其内容中的特定值,否则只需使用生成的URL即可。

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);
        }
    }
}