Mocking SecureRandom::nextInt()

試著忘記壹切 提交于 2021-02-08 01:57:04

问题


I have a class that uses a SecureRandom instance and grabs the next random number.

Lets say the example is:

public class ExampleClass() {
   public void method() { 
      Random sr = new SecureRandom();
      System.out.printf("%d %n", sr.nextInt(1));
      System.out.printf("%d %n", sr.nextInt(1));
   }
}

Test code

@RunWith(PowerMockRunner.class)
public class ExampleClassTest {
...
@Test
@PrepareOnlyThisForTest(SecureRandom.class)
public void mockedTest() throws Exception {

    Random spy = PowerMockito.spy(new SecureRandom());

    when(spy, method(SecureRandom.class, "nextInt", int.class))
            .withArguments(anyInt())
            .thenReturn(3, 0);


    instance.method();
}

When I am attempting to run the unit test, the unit test ends up freezing. When I attempt to debug only that method, JUnit reports back that the test isn't a member of the class.

No tests found matching Method mockedTest(ExampleClass) from org.junit.internal.requests.ClassRequest@6a6cb05c 

EDIT: Moving @PrepareOnlyThisForTest to PerpareForTests to the top of the class fixed the freezing issue. However I'm getting the problem that the method isn't being mocked.


回答1:


Try using @PrepareForTest at the class level of your test, not at method level.

@RunWith(PowerMockRunner.class)
@PrepareForTest(SecureRandom.class) 
public class ExampleClassTest {
...
}

Edit: In order to invoke the mock, you need to do the following:

1) Add the ExampleClass to the PrepareForTest annotation:

@RunWith(PowerMockRunner.class)
@PrepareForTest({SecureRandom.class, ExampleClass.class}) 
public class ExampleClassTest {
...
}

2) Mock the constructor call for SecureRandom:

SecureRandom mockRandom = Mockito.mock(SecureRandom.class);
PowerMockito.whenNew(SecureRandom.class).withNoArguments().thenReturn(mockRandom);

A working example is given below:

@RunWith(PowerMockRunner.class)
@PrepareForTest({SecureRandom.class, ExampleClass.class})
public class ExampleClassTest {

    private ExampleClass example = new ExampleClass();

    @Test
    public void aTest() throws Exception {

        SecureRandom mockRandom = Mockito.mock(SecureRandom.class);
       PowerMockito.whenNew(SecureRandom.class).withNoArguments().thenReturn(mockRandom);
        Mockito.when(mockRandom.nextInt(Mockito.anyInt())).thenReturn(3, 0);
        example.method();
   }
}


来源:https://stackoverflow.com/questions/23375700/mocking-securerandomnextint

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!