我有一个方法,我试图进行单元测试.此方法将参数作为ArrayList并使用它执行操作.我试图定义的模拟是:
ArrayList<String> mocked = mock(ArrayList.class);
Run Code Online (Sandbox Code Playgroud)
这给出了[未经检查]未经检查的转换"警告.
ArrayList<String> mocked = mock(ArrayList<String>.class);
Run Code Online (Sandbox Code Playgroud)
给了我一个错误.
任何人都想关心我做错了什么?
如何编写基于Mockito的JUnit方法来测试此方法adduser()?我尝试写一个,但它失败了一条错误消息,说不处理异常.显示错误:
when(service.addUser("nginx")).thenReturn("apache");
Run Code Online (Sandbox Code Playgroud)
假设addUser()业务类中的方法永远不会捕获任何异常,并且不会重新抛出.
class Business {
public User addUser() throws ServiceException{
User user = service.addUser("nginx");
return user;
}
}
Run Code Online (Sandbox Code Playgroud)
测试案例方法:
在测试类中,我使用@Mock属性模拟服务层类并注入它.
@Mock
Service service;
@InjectMocks
Business business = new Business();
@Test
public void testAddUser() {
when(service.addUser("nginx")).thenReturn("apache");
User user = business.addUser("nginx");
assertNotNull(user);
}
Run Code Online (Sandbox Code Playgroud)
请告诉我如何处理测试用例中的异常情况.
在Mockito,有没有办法验证我创建的任何模拟都没有更多的交互?
例如:
public void test()
{
...
TestObject obj = mock(TestObject);
myClass.test();
verifyNoMoreInteractionsWithMocks(); <-------
}
Run Code Online (Sandbox Code Playgroud)
有这样的方法吗?
我知道你可以在mock上设置几个不同的对象.防爆.
when(someObject.getObject()).thenReturn(object1,object2,object3);
Run Code Online (Sandbox Code Playgroud)
你能以某种方式用间谍物体做同样的事情吗?我在没有运气的间谍上尝试了上述内容.我在文档中读到了doReturn()如下所示的间谍
doReturn("foo").when(spy).get(0);
Run Code Online (Sandbox Code Playgroud)
但deReturn()只接受一个参数.我想在间谍上按特定顺序返回不同的对象.这可能吗?
我有一个类似下面的类,我正在尝试测试它.我想测试myClass,而不是anotherClass
public class myClass{
//class code that needs several instances of `anotherClass`
public anotherClass getObject(){
return new anotherClass();
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个A需要经过测试的课程.以下是定义A:
public class A {
public void methodOne(int argument) {
//some operations
methodTwo(int argument);
//some operations
}
private void methodTwo(int argument) {
DateTime dateTime = new DateTime();
//use dateTime to perform some operations
}
}
Run Code Online (Sandbox Code Playgroud)
并且基于该dateTime值,一些数据将被操纵,从数据库中检索.对于此数据库,值通过JSON文件保留.
这使事情复杂化.我需要的dateTime是在测试时将其设置为某个特定日期.有没有办法可以使用mockito模拟局部变量的值?
描述:
我试图从类中测试静态方法.我使用powerMock(1.6.2)+ mockito(1.10.19)与Junit4(4.12)和java8一起进行模拟.
问题:
获取错误:"无法使用名称com.gs.ops.domain.StaticClass转换类原因:java.io.IOException:无效的常量类型:18"
解决方案:
谷歌搜索线程与powermock问题 - mockito和java-8
从powermock中排除了java协助,并添加了java协助3.19.0-GA
试过不同版本的powermock(1.5.4,1.6.2 ......)
下面是异常堆栈跟踪:
java.lang.IllegalStateException: Failed to transform class with name com.StaticClass. Reason: java.io.IOException: invalid constant type: 18
at org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:266)
at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:180)
at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:68)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:340)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:145)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:40)
at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:244)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.<init>(JUnit4TestSuiteChunkerImpl.java:61)
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.<init>(AbstractCommonPowerMockRunner.java:32)
at org.powermock.modules.junit4.PowerMockRunner.<init>(PowerMockRunner.java:34)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
Caused by: java.lang.RuntimeException: java.io.IOException: invalid …Run Code Online (Sandbox Code Playgroud) 我试图使用Powermock和Mockito来模拟一个void静态方法来抛出异常,如下所示.但我遇到了一个问题.除非我使用相同的参数对Adder.add()进行两次调用,否则IOException不会抛出模拟的东西.
顺便说一句,我已经添加@RunWith(PowerMockRunner.class)并@PrepareForTest(Adder.class)在单元测试类.
class Adder{
public static void add(int i) throws IOException{
return;
}
}
@Test
public void testAdder() throws IOException{
PowerMockito.mockStatic(Adder.class);
PowerMockito.doThrow(new IOException()).when(Adder.class);
Adder.add(12);
try {
Adder.add(11);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// assert things
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.:)
答案如下.
在咨询http://code.google.com/p/powermock/issues/detail?id=278之后,实际上上面的Adder.add(12)是设置模拟静态方法的一部分.这意味着在使用参数12调用Adder.add()时,将抛出IOException.这很难理解,对吧?:)所以它应该写如下.
PowerMockito.mockStatic(Adder.class);
PowerMockito.doThrow(new IOException()).when(Adder.class);
Adder.add(anyInt());
Run Code Online (Sandbox Code Playgroud) 在我的测试中,我有以下几行:
when(client.runTask(anyString(), anyString(), isA(Iterable.class)).thenReturn(...)
Run Code Online (Sandbox Code Playgroud)
isA(Iterable.class)产生警告,它需要未经检查的转换以符合Iterable<Integer>.这是什么语法?
isA(Iterable<Integer>.class)
isA((Iterable<Integer>)Iterable.class
Run Code Online (Sandbox Code Playgroud)
不工作.
有什么建议?
我很嘲笑,我一直在尝试模拟实际内容(本质上只在内存中创建一个虚拟文件),这样就不会在任何时候将数据写入磁盘.
我已经尝试过像模拟文件和模拟尽可能多的我可以解决的许多属性的解决方案,然后用文件编写器/缓冲区写入器写入它,但是那些不能正常工作,因为它们需要规范路径.有人找到了这个或类似的解决方案,但我接近这个错误?
我一直在这样做:
private void mocking(){
File badHTML = mock(File.class);
//setting the properties of badHTML
when(badHTML.canExecute()).thenReturn(Boolean.FALSE);
when(badHTML.canRead()).thenReturn(Boolean.TRUE);
when(badHTML.canWrite()).thenReturn(Boolean.TRUE);
when(badHTML.compareTo(badHTML)).thenReturn(Integer.SIZE);
when(badHTML.delete()).thenReturn(Boolean.FALSE);
when(badHTML.getFreeSpace()).thenReturn(0l);
when(badHTML.getName()).thenReturn("bad.html");
when(badHTML.getParent()).thenReturn(null);
when(badHTML.getPath()).thenReturn("bad.html");
when(badHTML.getParentFile()).thenReturn(null);
when(badHTML.getTotalSpace()).thenReturn(0l);
when(badHTML.isAbsolute()).thenReturn(Boolean.FALSE);
when(badHTML.isDirectory()).thenReturn(Boolean.FALSE);
when(badHTML.isFile()).thenReturn(Boolean.TRUE);
when(badHTML.isHidden()).thenReturn(Boolean.FALSE);
when(badHTML.lastModified()).thenReturn(System.currentTimeMillis());
when(badHTML.mkdir()).thenReturn(Boolean.FALSE);
when(badHTML.mkdirs()).thenReturn(Boolean.FALSE);
when(badHTML.setReadOnly()).thenReturn(Boolean.FALSE);
when(badHTML.setExecutable(true)).thenReturn(Boolean.FALSE);
when(badHTML.setExecutable(false)).thenReturn(Boolean.TRUE);
when(badHTML.setReadOnly()).thenReturn(Boolean.FALSE);
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(badHTML));
/*
badHTMLText is a string with the contents i want to put into the file,
can be just about whatever you want
*/
bw.append(badHTMLText);
bw.close();
} catch (IOException ex) {
System.err.println(ex);
}
}
Run Code Online (Sandbox Code Playgroud)
任何想法或指导都会非常有帮助.在此之后的某个地方我基本上尝试使用另一个类从文件中读取.我会尝试模拟某种输入流,但另一类不接受输入流,因为它是项目的io处理类.
我有界面
Interface MyInterface {
myMethodToBeVerified (String, String);
}
Run Code Online (Sandbox Code Playgroud)
并且接口的实现是
class MyClassToBeTested implements MyInterface {
myMethodToBeVerified(String, String) {
…….
}
}
Run Code Online (Sandbox Code Playgroud)
我有另一堂课
class MyClass {
MyInterface myObj = new MyClassToBeTested();
public void abc(){
myObj.myMethodToBeVerified (new String(“a”), new String(“b”));
}
Run Code Online (Sandbox Code Playgroud)
}
我正在尝试为MyClass编写JUnit.我已经做好了
class MyClassTest {
MyClass myClass = new MyClass();
@Mock
MyInterface myInterface;
testAbc(){
myClass.abc();
verify(myInterface).myMethodToBeVerified(new String(“a”), new String(“b”));
}
}
Run Code Online (Sandbox Code Playgroud)
但是我想得到 mockito但是没有被调用,实际上在验证调用时没有与这个模拟器进行零交互.
谁能建议一些解决方案.