我正在寻找一种方法来验证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-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) 思考这个的一种方法是:如果我们关心代码的设计则EasyMock的是更好的选择,因为它通过它的期望概念,让反馈给您.
如果我们关心的测试可维护性(更容易读,写和具有不会受到太大变化不太脆测试),那么似乎的Mockito一个更好的选择.
我的问题是:
我有以下简单的控制器来捕获任何意外的异常:
@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获取异常并返回适当的响应.
有关为什么这不起作用以及我应该如何进行此类测试的任何想法?
谢谢.
例如我有处理程序:
@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来嘲笑它的方法?
我可以测试一下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)
我可以做出虚假的回应,但我需要测试真实.它成功了吗?它的身体是否正确?你能帮我代码吗?
我正在使用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) 我最近问了几个关于jUnit和Mockito的问题,我仍然在努力解决这个问题.这些教程都是非常简单的示例,所以我很难扩展我的测试用例以适应我的课程.
我正在尝试为我在webapp中的一个代理中的方法编写一些测试用例.该方法与代理内部的其他几种方法交互以验证某些对象.我现在只想测试这一种方法.
这是我试图做的事情:
像这样创建我的代理的Mockito对象:
MyProcessingAgent mockMyAgent = Mockito.mock(MyProcessingAgent.class);
使用Mockito.when设置存根(希望是正确的术语),如下所示:
Mockito.when(mockMyAgent.otherMethod(Mockito.any(arg1)).thenReturn(requiredReturnArg);
尝试执行我的方法,如下所示:
List myReturnValue = mockMyAgent.methodThatNeedsTestCase();
我期待的东西myReturnValue,但收到0反而所以我试图调试.当我调用该方法时,它永远不会执行.我在方法的第一行有一个调试点,永远不会被触及.
如果我想在类的一个方法中执行代码,但强制类中的其他方法(尝试与外部世界中的数据库交互的方法)返回伪造的值.这可能与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第三方提供并且无法修改时,还有其他方法可以解决此问题吗?
我正在尝试为通话创建一个模拟器.说我有这个方法我试图存根:
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"以外的其他?
mockito ×10
java ×7
junit ×4
mocking ×3
unit-testing ×3
android ×1
easymock ×1
generics ×1
matcher ×1
retrofit2 ×1
robolectric ×1
spring ×1
spring-mvc ×1
stubbing ×1
testing ×1