- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我一直在 mock
clazz = Class.forName("Complete Class path")
Object obj = clazz.Constructor().getInstance();
我在谷歌上搜索了一下,找到了一些链接,这些链接告诉我们如何使用 powermock 模拟静态方法。我尝试使用这些逻辑来模拟
Class.forName("完整类路径")
和
Object obj = clazz.Constructor().getInstance()
但一直面临错误。
at sun.reflect.GeneratedSerializationConstructorAccessor16.newInstance(Unknown Source) [junit]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) [junit]
at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:45) [junit]
at org.powermock.reflect.internal.WhiteboxImpl.newInstance(WhiteboxImpl.java:223) [junit]
at org.powermock.reflect.Whitebox.newInstance(Whitebox.java:139) [junit]
at org.powermock.api.mockito.internal.mockcreation.MockCreator.mock(MockCreator.java:64) [junit]
at org.powermock.api.mockito.PowerMockito.mock(PowerMockito.java:203) [junit]
at org.powermock.api.extension.listener.AnnotationEnabler.standardInject(AnnotationEnabler.java:106) [junit]
at org.powermock.api.extension.listener.AnnotationEnabler.beforeTestMethod(AnnotationEnabler.java:54) [junit]
at org.powermock.tests.utils.impl.PowerMockTestNotifierImpl.notifyBeforeTestMethod(PowerMockTestNotifierImpl.java:90) [junit]
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:292) [junit]
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127) [junit]
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82) [junit]
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282) [junit]
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87) [junit]
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50) [junit]
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207) [junit]
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146) [junit]
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120) [junit]
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34) [junit]
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44) [junit]
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:122) [junit]
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:106) [junit]
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
最佳答案
我不认为模拟 Class
是个好主意,您应该重写代码以使其更易于测试。您应该将您的组件创建委托(delegate)给一个工厂,然后很容易模拟它。
这是您的工厂的样子:
public interface MyObjectFactory {
MyObject create();
}
然后在需要创建这个对象的类中,添加工厂作为字段
public class MyClass {
// The factory that will create my objects
private MyObjectFactory factory;
public void someMethod() {
// Calls the factory to create my object
MyObject object = factory.create();
...
}
}
完成后,您可以使用 Mockito模拟您的 MyObjectFactory
以提供您选择的 MyObject
实例。
那么测试用例将是:
@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {
@Mock
MyObjectFactory factory;
@InjectMocks
MyClass myClass = new MyClass();
@Test
public void testSomeMethod() {
...
Mockito.when(factory.create()).thenReturn(myObject);
// Call the method
myClass.someMethod();
}
}
关于java - 如何模拟 Class.forName 和 class.Constructor.newInstance(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39279255/
我想将类名作为打印方法中的参数传递。例如:public void printAll(String className)我还创建了一份动物 list 。我只想打印属于名称为 className 的类的节
我是 Rails 的初学者,在改进我的搜索查询时遇到了一些问题: 在我调用的 Controller 中: def index if params[:search] @persons = Pers
我正在检查代码并遇到以下行。 Charset.forName("ASCII") 但是当我查看 java documentation它只有 US-ASCII ISO-8859-1 UTF-8
想知道为什么 Class.forName("com.mysql.jdbc.Driver"); 和 Class.forName("com.mysql.jdbc.Driver").newInstance(
想知道为什么 Class.forName("com.mysql.jdbc.Driver"); 和 Class.forName("com.mysql.jdbc.Driver").newInstance(
这行代码 Class cls = (Class) Class.forName("java.lang.String"); 给出编译器警告 Type safety: Unchecked cast fr
之间有什么区别: List cats = session.createCriteria(Cat.class) .add( Restrictions.like("name", "F%") .list(
是否存在与Class.forName等效的gradle或实现它的更具gradle / groovy的方式。 我想在gradle中实现的目标如下: for(String name : new S
如何让用户插入字符串并检查具有相同“名称”的类? 假设我有一个标记为 public A[] getB(String bString) 的方法和两个类,A 和 B,其中 B扩展A。 在此方法中,我想搜索
我有一个在其中调用 Class.forName() 的方法。当我创建单元测试时,它会抛出 ClassNotFoundException。有没有办法模拟 Class.forName() 行为? 需要测试
我收到以下编译错误: Tester.java:10: unreported exception java.lang.ClassNotFoundException; must be caught or
我原以为以下两个赋值都是有效的,但第二个赋值引发了类未找到异常。有任何想法吗? missionIntent = new Intent(this, Mission00.class); /*DEBUG*/
我正在尝试使用 java 反射加载一堆类。一切似乎都工作正常(如果找不到类,我正在处理异常)。 但是,有一个特定的类引发了另一个异常,该异常不是通过调用 Class.forname() 而是通过内部方
我使用 Class.forname() 使用以下代码动态创建实例: String className = "models." + category; Class c = Class.forName(c
我有一个名为 Customer.java 的 Java 文件,位于文件夹 d:/sample 目录 中。但是当我使用 Class.forName("d:/sample/Customer") 时,它会抛
假设我有一个类Point。当我这样做时: Class myClass = Class.forName("Point"); 它有效。但当我这样做时: Class myNewClass = Class.f
好吧,考虑以下示例: inside of the src/ folder, i have the following packages : org/ com/ Foo 类位于 org.somepack
我 想要 必须编写一些动态加载类的工具。所以我必须为此调用 Class.forName 函数。可以有很多类 - 大约 10000 个。是否可以在加载所有类但不再需要它们后释放内存? 最佳答案 这个问题
我正在尝试使用 Class.forName 从 android.os.Build 类获取字符串,但我收到错误 NoSuchFieldException。 这是我的代码: public String g
这个问题在这里已经有了答案: How does Class.forName() work? (4 个答案) 关闭 9 年前。 在进行简单的 JDBC 连接时,所有资源都给出相同的代码 String
我是一名优秀的程序员,十分优秀!