我如何模拟正在内联初始化的字段变量?
例如
class Test {
private Person person = new Person();
...
public void testMethod() {
person.someMethod();
...
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我想在测试方法时测试person.someMethod() - Test#testMethod.
我需要模拟person变量的初始化.任何线索?
编辑:我不允许修改Person类.
给出一个Kotlin单例对象和一个称之为方法的乐趣
object SomeObject {
fun someFun() {}
}
fun callerFun() {
SomeObject.someFun()
}
Run Code Online (Sandbox Code Playgroud)
有没有办法模拟电话SomeObject.someFun()?
最近我正在将项目从 JDK 11 升级到 JDK 17。升级后,powermock 似乎出现问题。运行 AUT 时,出现以下错误:
java.lang.RuntimeException: PowerMock internal error: Should never throw exception at this level
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException accessible: module java.base does not "opens java.lang" to unnamed module @3fc34119
Run Code Online (Sandbox Code Playgroud)
您是否知道此问题的任何解决方法,如果可以,请提供解决方案。
我正在尝试使用PowerMockRunner编写单元测试但是我收到以下错误:
java.lang.IllegalStateException:扩展API内部错误:org.powermock.api.extension.reporter.MockingFrameworkReporterFactoryImpl无法位于类路径中.在org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.getFrameworkReporterFactory(AbstractTestSuiteChunkerImpl.java:190)在org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.getMockingFrameworkReporter(JUnit4TestSuiteChunkerImpl.java:140)在org.powermock org.powermock上的org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)中的.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:119) .modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)位于org.eclipse.jdt.internal.junit.runner的org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) .TestExecution.run(TestExecution.java:38)org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests (RemoteTestRunner.java:675)org.eclipse.jdt.internal.junit.ru nner.RemoteTestRunner.run(RemoteTestRunner.java:382)at or.e.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
我检查了所有依赖项,没关系,我还需要其他东西吗?
在通常使用@Mock和@InjectMocks注释的模拟中,测试中的类应该运行@RunWith(MockitoJUnitRunner.class).
@RunWith(MockitoJUnitRunner.class)
public class ReportServiceImplTestMockito {
@Mock
private TaskService mockTaskService;
@InjectMocks
private ReportServiceImpl service;
// Some tests
}
Run Code Online (Sandbox Code Playgroud)
但在某些例子中,我看到@RunWith(PowerMockRunner.class)被使用:
@RunWith(PowerMockRunner.class)
public class Tests {
@Mock
private ISomething mockedSomething;
@Test
public void test1() {
// Is the value of mockedSomething here
}
@Test
public void test2() {
// Is a new value of mockedSomething here
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以指出它的差异是什么时候我想用一个而不是另一个?
我想模拟一个继承的受保护方法.我无法直接从java代码调用此方法,因为它从另一个包中的类继承.我找不到一种方法来指定这个方法来存入when(...)
package a;
public class A() {
protected int m() {}
}
package b;
public class B extends a.A {
// this class currently does not override m method from a.A
public asd() {}
}
// test
package b;
class BTest {
@Test
public void testClass() {
B instance = PowerMockito.spy(new B());
PowerMockito.when(instance, <specify a method m>).thenReturn(123);
//PowerMockito.when(instance.m()).thenReturn(123); -- obviously does not work
}
}
Run Code Online (Sandbox Code Playgroud)
我查看了PowerMockito.when覆盖,这似乎只是私人方法!
如何指定受保护的方法?
我有一个方法,我需要编写单元测试用例.该方法返回一个Page类型.
我该如何模仿这种方法?
方法:
public Page<Company> findAllCompany( final Pageable pageable )
{
return companyRepository.findAllByIsActiveTrue(pageable);
}
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助
我们使用Powermockito和Mockito来模拟一些静态类.似乎java.lang.ExceptionInInitializerError每次都会抛出.
你能帮我找出问题所在吗?
正在测试的Java类
package com.myproject.myproduct.search.domain;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
public class MyQueryBuilder {
public MultiMatchQueryBuilder getMultiMatchQueryBuilder() {
MultiMatchQueryBuilder builder = QueryBuilders.multiMatchQuery("term", "field1");
builder.field("field1",200.9f);
return builder;
}
}
Run Code Online (Sandbox Code Playgroud)
使用Powermock跑步者进行Junit测试
package com.myproject.myproduct.search.domain;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest(QueryBuilders.class)
public class MyQueryBuilderTest {
private MyQueryBuilder myQueryBuilder;
@Test
public void test() {
PowerMockito.mockStatic(QueryBuilders.class);
MultiMatchQueryBuilder builder = PowerMockito.mock(MultiMatchQueryBuilder.class);
}
}
Run Code Online (Sandbox Code Playgroud)
而已.一旦我尝试模拟MultiMatchQueryBuilder,测试代码就无法运行.
这是例外:
位于org.elasticsearch.index.query.AbstractQueryBuilder的org.elasticsearch.common.ParseField.(ParseField.java:35)的org.elasticsearch.common.logging.DeprecationLogger.(DeprecationLogger.java:138)中的java.lang.ExceptionInInitializerError. (AbstractQueryBuilder.java:53)在sun.reflect.GeneratedSerializationConstructorAccessor7.newInstance(未知来源)在java.lang.reflect.Constructor.newInstance(Constructor.java:423)在org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator的.java:40)在org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:59)在org.mockito.internal.creation.jmock.ClassImposterizer.createProxy(ClassImposterizer.java:128)在org.mockito.internal.creation. jmock.ClassImposterizer.imposterise(ClassImposterizer.java:63)atg.powermock.api.mockito.internal.mockcreation.MockCreator.createMethodInvocationControl(MockCreator.java:111)org.powermock.api.mockito.internal.mockcreation.MockCreator.模拟(MockCreator.java:6 0)在org.powermock.api.mockito.PowerMockito.mock(PowerMockito.java:143)的com.spartasystems.stratas.search.domain.MyQueryBuilderTest.testBoostSetProperly(MyQueryBuilderTest.java:22)at sun.reflect.NativeMethodAccessorImpl.invoke0 (本地方法)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498) )在org.junit的org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ …
这里的第一个计时器,如果我错过任何事情,我会道歉.我希望能够使用Spock来调用静态方法.反馈会很棒
随着groovy嘲笑,我以为我能够通过静态调用,但没有找到它.作为背景,我正在改进遗留Java中的测试.禁止重构.我正在使用spock-0.7和groovy-1.8.
对静态方法的调用以这种形式与实例调用链接:
public class ClassUnderTest{
public void methodUnderTest(Parameter param){
//everything else commented out
Thing someThing = ClassWithStatic.staticMethodThatReturnsAnInstance().instanceMethod(param);
}
}
Run Code Online (Sandbox Code Playgroud)
staticMethod返回ClassWithStatic的实例instanceMethod返回方法其余部分所需的Thing
如果我直接运行全局模拟,它会返回模拟的实例ok:
def exerciseTheStaticMock(){
given:
def globalMock = GroovyMock(ClassWithStatic,global: true)
def instanceMock = Mock(ClassWithStatic)
when:
println(ClassWithStatic.staticMethodThatReturnsAnInstance().instanceMethod(testParam))
then:
interaction{
1 * ClassWithStatic.staticMethodThatReturnsAnInstance() >> instanceMock
1 * instanceMock.instanceMethod(_) >> returnThing
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果我从ClassUnderTest运行methodUnderTest:
def failingAttemptToGetPastStatic(){
given:
def globalMock = GroovyMock(ClassWithStatic,global: true)
def instanceMock = Mock(ClassWithStatic)
ClassUnderTest myClassUnderTest = new ClassUnderTest()
when:
myClassUnderTest.methodUnderTest(testParam)
then:
interaction{
1 * ClassWithStatic.staticMethodThatReturnsAnInstance() >> instanceMock
1 * instanceMock.instanceMethod(_) …Run Code Online (Sandbox Code Playgroud) 有点复杂的设置.Robolectric,PowerMockito基于规则的配置.
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"})
// Using "PrepareOnlyThis" prevents powermock from trying to instrument the whole hierarchy,
// part of which we've ignored (android.os.* in this case)
@PrepareOnlyThisForTest({ServiceCallbackBase.class}) // this class extends Handler,
// so we need PrepareOnlyThis. It also has some final methods we need to verify()
public class ServiceBaseTests {
private class Foo {
// nothing
}
@Rule
public PowerMockRule rule = new PowerMockRule();
private ServiceCallbackBase<Object, Foo> setupCallback( boolean hasValidContext, boolean allContextsCanceled …Run Code Online (Sandbox Code Playgroud) powermockito ×10
java ×7
powermock ×7
mockito ×6
mocking ×3
junit ×2
junit4 ×2
android ×1
eclipse ×1
groovy ×1
java-17 ×1
kotlin ×1
robolectric ×1
spock ×1
unit-testing ×1