标签: mockito

Mockito - 如何验证模拟从未被调用过

我正在寻找一种方法来验证Mockito,在测试期间没有与给定模拟器的任何交互.对于具有验证模式的给定方法,很容易实现never(),但我还没有找到完整模拟的解决方案.

我实际想要实现的目标:在测试中验证,没有任何内容打印到控制台.jUnit的一般想法是这样的:

private PrintStream systemOut;

@Before
public void setUp() {
    // spy on System.out
    systemOut = spy(System.out);
}

@After
public void tearDown() {
    verify(systemOut, never());  // <-- that doesn't work, just shows the intention
}
Run Code Online (Sandbox Code Playgroud)

A PrintStream有很多方法,我真的不想用每个单独的验证验证每个方法 - 对于System.err...来说也是如此

所以我希望,如果有一个简单的解决方案,我可以,鉴于我有一个很好的测试覆盖率,迫使软件工程师(和我自己)删除他们的(我的)调试代码,System.out.println("Breakpoint#1");或者e.printStacktrace();在提交更改之前或之前.

java junit mockito

49
推荐指数
4
解决办法
3万
查看次数

Mockito - 存根方法时的NullpointerException

所以我开始为Java-Spring项目编写测试.

我使用的是JUnit和Mockito.据说,当我使用when()... thenReturn()选项时,我可以模拟服务,而不需要模拟它们.所以我想做的是,设置:

when(classIwantToTest.object.get().methodWhichReturnsAList(input))thenReturn(ListcreatedInsideTheTestClass)  
Run Code Online (Sandbox Code Playgroud)

但无论我在哪个when子句中,我总是得到一个NullpointerException,当然这是有意义的,因为输入是null.

当我尝试从对象模拟另一个方法时:

when(object.method()).thenReturn(true)
Run Code Online (Sandbox Code Playgroud)

在那里我也得到一个Nullpointer,因为该方法需要一个未设置的变量.

但我想使用when().. thenReturn()来绕过创建这个变量等等.我只是想确保,如果任何类调用此方法,那么无论如何,只返回true或上面的列表.

这是我身边的一个基本误解,还是有其他错误?

码:

public class classIWantToTest implements classIWantToTestFacade{
        @Autowired
        private SomeService myService;

        @Override
        public Optional<OutputData> getInformations(final InputData inputData) {
            final Optional<OutputData> data = myService.getListWithData(inputData);
            if (data.isPresent()) {
                final List<ItemData> allData = data.get().getItemDatas();
                    //do something with the data and allData
                return data;
            }

            return Optional.absent();
        }   
}
Run Code Online (Sandbox Code Playgroud)

这是我的测试类:

public class Test {

    private InputData inputdata;

    private ClassUnderTest classUnderTest;

    final List<ItemData> allData = new ArrayList<ItemData>();

    @Mock
    private DeliveryItemData item1;

    @Mock
    private DeliveryItemData item2; …
Run Code Online (Sandbox Code Playgroud)

java testing junit mockito stubbing

49
推荐指数
11
解决办法
10万
查看次数

EasyMock vs Mockito:设计与可维护性?

思考这个的一种方法是:如果我们关心代码的设计则EasyMock的是更好的选择,因为它通过它的期望概念,让反馈给您.

如果我们关心的测试可维护性(更容易读,写和具有不会受到太大变化不太脆测试),那么似乎的Mockito一个更好的选择.

我的问题是:

  • 如果您在大型项目中使用过EasyMock,您是否发现您的测试难以维护?
  • Mockito有什么限制(除了endo测试)?

easymock mockito

48
推荐指数
5
解决办法
3万
查看次数

使用Spring MVC Test测试Spring MVC @ExceptionHandler方法

我有以下简单的控制器来捕获任何意外的异常:

@ControllerAdvice
public class ExceptionController {

    @ExceptionHandler(Throwable.class)
    @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public ResponseEntity handleException(Throwable ex) {
        return ResponseEntityFactory.internalServerErrorResponse("Unexpected error has occurred.", ex);
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用Spring MVC Test框架编写集成测试.这是我到目前为止:

@RunWith(MockitoJUnitRunner.class)
public class ExceptionControllerTest {
    private MockMvc mockMvc;

    @Mock
    private StatusController statusController;

    @Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.standaloneSetup(new ExceptionController(), statusController).build();
    }

    @Test
    public void checkUnexpectedExceptionsAreCaughtAndStatusCode500IsReturnedInResponse() throws Exception {

        when(statusController.checkHealth()).thenThrow(new RuntimeException("Unexpected Exception"));

        mockMvc.perform(get("/api/status"))
                .andDo(print())
                .andExpect(status().isInternalServerError())
                .andExpect(jsonPath("$.error").value("Unexpected Exception"));
    }
}
Run Code Online (Sandbox Code Playgroud)

我在Spring MVC基础结构中注册了ExceptionController和一个模拟StatusController.在测试方法中,我设置了从StatusController抛出异常的期望.

抛出异常,但ExceptionController没有处理它.

我希望能够测试ExceptionController获取异常并返回适当的响应.

有关为什么这不起作用以及我应该如何进行此类测试的任何想法?

谢谢.

spring spring-mvc mockito spring-mvc-test

48
推荐指数
3
解决办法
4万
查看次数

我如何模拟@InjectMocks类的方法?

例如我有处理程序:

@Component
public class MyHandler {

  @AutoWired
  private MyDependency myDependency;

  public int someMethod() {
    ...
    return anotherMethod();
  }

  public int anotherMethod() {...}
}
Run Code Online (Sandbox Code Playgroud)

测试它我想写这样的东西:

@RunWith(MockitoJUnitRunner.class}
class MyHandlerTest {

  @InjectMocks
  private MyHandler myHandler;

  @Mock
  private MyDependency myDependency;

  @Test
  public void testSomeMethod() {
    when(myHandler.anotherMethod()).thenReturn(1);
    assertEquals(myHandler.someMethod() == 1);
  }
}
Run Code Online (Sandbox Code Playgroud)

但它实际上anotherMethod()只要我试图模仿它就会调用它.我该怎么做myHandler来嘲笑它的方法?

java unit-testing mocking mockito

48
推荐指数
2
解决办法
3万
查看次数

使用Retrofit2和Mockito或Robolectric进行Android单元测试

我可以测试一下retrofit2beta4的真实反应吗?我需要Mockito还是Robolectic?

我的项目中没有活动,它将是一个库,我需要测试服务器是否正确响应.现在我有这样的代码而且卡住了......

@Mock
ApiManager apiManager;

@Captor
private ArgumentCaptor<ApiCallback<Void>> cb;

@Before
public void setUp() throws Exception {
    apiManager = ApiManager.getInstance();
    MockitoAnnotations.initMocks(this);
}

@Test
public void test_login() {
    Mockito.verify(apiManager)
           .loginUser(Mockito.eq(login), Mockito.eq(pass), cb.capture());
    // cb.getValue();
    // assertEquals(cb.getValue().isError(), false);
}
Run Code Online (Sandbox Code Playgroud)

我可以做出虚假的回应,但我需要测试真实.它成功了吗?它的身体是否正确?你能帮我代码吗?

android unit-testing mockito robolectric retrofit2

48
推荐指数
2
解决办法
2万
查看次数

使用Mockito验证方法后没有调用任何内容

我正在使用Mockito在Java中编写单元测试,我想验证某个方法是最后一个调用对象的方法.

我正在测试的代码中做这样的事情:

row.setSomething(value);
row.setSomethingElse(anotherValue);
row.editABunchMoreStuff();
row.saveToDatabase();
Run Code Online (Sandbox Code Playgroud)

在我的模拟中,我并不关心我在行上编辑所有内容的顺序,但是在我保存它之后我不再尝试对它做任何事情是非常重要的.有没有办法做到这一点?

请注意,我不是在寻找verifyNoMoreInteractions:它不会确认saveToDatabase是最后调用的东西,如果我在没有显式验证的行上调用任何内容,它也会失败.我希望能够说出类似的话:

verify(row).setSomething(value);
verify(row).setSomethingElse(anotherValue);
verifyTheLastThingCalledOn(row).saveToDatabase();
Run Code Online (Sandbox Code Playgroud)

如果它有帮助,我将从JMock测试中切换到Mockito:

row.expects(once()).method("saveToDatabase").id("save");
row.expects(never()).method(ANYTHING).after("save");
Run Code Online (Sandbox Code Playgroud)

java unit-testing mocking mockito

47
推荐指数
2
解决办法
4万
查看次数

使用Mockito存根并执行测试方法

我最近问了几个关于jUnit和Mockito的问题,我仍然在努力解决这个问题.这些教程都是非常简单的示例,所以我很难扩展我的测试用例以适应我的课程.

我正在尝试为我在webapp中的一个代理中的方法编写一些测试用例.该方法与代理内部的其他几种方法交互以验证某些对象.我现在只想测试这一种方法.

这是我试图做的事情:

  1. 像这样创建我的代理的Mockito对象:

    MyProcessingAgent mockMyAgent = Mockito.mock(MyProcessingAgent.class);

  2. 使用Mockito.when设置存根(希望是正确的术语),如下所示:

    Mockito.when(mockMyAgent.otherMethod(Mockito.any(arg1)).thenReturn(requiredReturnArg);

  3. 尝试执行我的方法,如下所示:

    List myReturnValue = mockMyAgent.methodThatNeedsTestCase();

我期待的东西myReturnValue,但收到0反而所以我试图调试.当我调用该方法时,它永远不会执行.我在方法的第一行有一个调试点,永远不会被触及.

如果我想在类的一个方法中执行代码,但强制类中的其他方法(尝试与外部世界中的数据库交互的方法)返回伪造的值.这可能与Mockito一起吗?

看来我目前的方法不是一种正确的测试方式,但我不确定如何向前推进.我可以模拟我的类并让一个方法像正常一样执行,而其他方法被存根以返回我给定的值,这样我在测试这个方法时就不必处理数据访问了吗?

java junit mocking mockito

47
推荐指数
2
解决办法
12万
查看次数

使用mockito模拟使用通配符返回泛型的方法

我正在使用mockito 1.9.5.我有以下代码:

public class ClassA  {

public List<? extends MyInterface> getMyInterfaces() {
    return null;
}

public static void testMock() {
    List<MyInterface> interfaces = new ArrayList<>();
    ClassA classAMock = mock(ClassA.class);
    when(classAMock.getMyInterfaces()).thenReturn(interfaces);      
}
Run Code Online (Sandbox Code Playgroud)

我得到一个编译错误的thenReturn(interfaces)说法:

"The method thenReturn(List<capture#1-of ? extends MyInterface>) in the type 
 OngoingStubbing<List<capture#1-of ? extends MyInterface>> is not applicable for the arguments 
 (List<MyInterface>)"
Run Code Online (Sandbox Code Playgroud)

但是,当我使用thenAnswermockito 的方法时,我没有得到错误.谁能告诉我发生了什么事?使用该thenReturn方法时为什么会出现错误?当ClassA第三方提供并且无法修改时,还有其他方法可以解决此问题吗?

java generics mockito

46
推荐指数
2
解决办法
2万
查看次数

如何编写一个不等于某事的匹配器

我正在尝试为通话创建一个模拟器.说我有这个方法我试图存根:

class ClassA {
  public String getString(String a) {
    return a + "hey";
  }
}
Run Code Online (Sandbox Code Playgroud)

我想嘲笑的是:第一个例子是

when(classA.getString(eq("a")).thenReturn(...);`
Run Code Online (Sandbox Code Playgroud)

在同一测试案例中

when(classA.getString([anything that is not a])).thenReturn(somethingelse);
Run Code Online (Sandbox Code Playgroud)

第二个案例是我的问题:我如何匹配anyString()"a"以外的其他?

java junit matcher mockito

45
推荐指数
3
解决办法
2万
查看次数