小编Bri*_*ice的帖子

Mockito.any()传递与泛型的接口

是否可以通过泛型传递接口的类型?

界面:

public interface AsyncCallback<T>
Run Code Online (Sandbox Code Playgroud)

在我的测试方法中:

Mockito.any(AsyncCallback.class)
Run Code Online (Sandbox Code Playgroud)

<ResponseX>后面或.class没有工作.

java generics mockito

145
推荐指数
4
解决办法
7万
查看次数

使用Mockito,如何验证方法是否具有某个参数?

我正在使用Mockito 1.9.0.我如何验证一个方法只被调用一次,并且传递给它的一个字段包含一定的值?在我的JUnit测试中,我有

@Before
public void setupMainProg() { 
    // Initialize m_orderSvc, m_opportunitySvc, m_myprojectOrgSvc
    ...
    m_prog = new ProcessOrdersWorker(m_orderSvc, m_opportunitySvc, m_myprojectOrgSvc);
}   // setupMainProg

@Test
public void testItAll() throws GeneralSecurityException, IOException { 
    m_prog.work();  
}
Run Code Online (Sandbox Code Playgroud)

方法"work"调用"m_orderSvc"方法(传递给对象的参数之一)."m_orderSvc"又包含一个成员字段"m_contractsDao".我想验证"m_contractsDao.save"只被调用一次,并且传递给它的参数包含一个特定值.

这可能有点令人困惑.让我知道如何澄清我的问题,我很高兴这样做.

java mocking mockito

52
推荐指数
3
解决办法
10万
查看次数

在onNext()中没有传递任何内容的Observable

我需要一个Observable,例如提供一个系统时钟,它不需要在onNext()中传递任何东西.我找不到允许我这样做的签名.

当然,我可以使用任何对象,然后传递null,但这没有多大意义.所以我的问题是,是否有更好的方法来做到这一点.

Observable.create(new Observable.OnSubscribe<Anyobject>() { // use any object in the signature

            @Override public void call(Subscriber<? super Anyobject> subscriber) {

                    subscriber.onNext(null); // then pass null
                    subscriber.onCompleted();

            }

        })
Run Code Online (Sandbox Code Playgroud)

java rx-java

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

存根与mockito之间的区别

我是mockito的新手.

需要知道存根与何时的区别

      1. stub(cpproxy.getBinList()).toReturn(gettestbins());
      2. when(cpproxy.getBinList()).thenReturn(gettestbins());
Run Code Online (Sandbox Code Playgroud)

这两者之间有什么区别?

java unit-testing junit4 mockito

35
推荐指数
1
解决办法
1万
查看次数

看起来正确的doThrow中的Mockito异常

我正在尝试模拟一个方法,看看我是否正确处理异常.这是我得到的.

接口:

interface SampleManager {
    void deleteVariome(String specimenId, String analysisId) throws Exception;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

单元测试:

// ...
SampleManger sampleManager = mock(SampleManager.class);

// below is line 753
doThrow(Exception.class).when(sampleManager).deleteVariome(sample1.getId(), analysisId);
Run Code Online (Sandbox Code Playgroud)

结果:

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
-> at ...server.ArchiveManagerImplUTest.deleteVariomeFails(ArchiveManagerImplUTest.java:753)

E.g. thenReturn() may be missing.
Examples of correct stubbing:
    when(mock.isOk()).thenReturn(true);
    when(mock.isOk()).thenThrow(exception);
    doThrow(exception).when(mock).someVoidMethod(); <-- this looks a log like what I did!

Hints:

 1. missing thenReturn()

 2. you are trying to stub a final method, you naughty developer! <-- I have a lot …
Run Code Online (Sandbox Code Playgroud)

java mockito

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

模拟基于反射的调用

我试图模拟一些基于反射的方法.在下面你可以看到细节,

被测试的班级

public class TracerLog {
    @AroundInvoke
    public Object logCall(InvocationContext context) throws Exception {
        Logger logger = new Logger();
        String message = "INFO: Invoking method - " 
                + context.getMethod().getName() + "() of Class - " 
                + context.getMethod().getDeclaringClass();

        logger.write(message);
        return context.proceed();
    }
}
Run Code Online (Sandbox Code Playgroud)

测试

public class TracerLogTest {

@Mock
InvocationContext mockContext;
@Mock
Logger mockLogger;
@InjectMocks
private TracerLog cut = new TracerLog();

@BeforeMethod
public void setup() {
    MockitoAnnotations.initMocks(this);
}

@Test
public void logCallTest() throws Exception {
    when(mockContext.proceed()).thenReturn(true);
    when(mockContext.getMethod().getDeclaringClass().getName()).thenReturn("someClass");
    cut.logCall(mockContext);
    verify(mockContext).proceed();
}
Run Code Online (Sandbox Code Playgroud)

} …

java mocking mockito ejb-3.0

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

Mockito绕过静态方法进行测试

我需要使用Mockito测试handleIn()方法.

但是代码需要调用这个遗留代码Util.getContextPDO,这是一个静态方法.

请注意,在测试环境中,此Util.getContextPDO始终返回Exception,并且我打算通过始终返回虚拟IPDO来绕过此Util.getContextPDO().

public class MyClass {
  public IPDO getIPDO() 
  {
    return Util.getContextPDO(); // note that Util.getContextPDO() is a static, not mockable.
  }

  public String handleIn(Object input) throws Throwable 
  {
    String result = "";
    IPDO pdo = getIPDO();

    // some important business logic.

    return result;
  } 
}
Run Code Online (Sandbox Code Playgroud)

最初我认为这可以通过使用类"MyClass"的spy()来实现,所以我可以模拟getIPDO()的返回值.以下是我使用spy()的初步努力

@Test
public void testHandleIn() throws Exception
{
    IPDO pdo = new PDODummy();


    MyClass handler = new MyClass ();
    MyClass handler2 = spy(handler);

    when(handler2.getIPDO()).thenReturn(pdo);
    PDOUtil.setPDO(pdo, LogicalFieldEnum.P_TX_CTGY, "test123");
    IPDO pdoNew = handler2.getIPDO();

    Assert.assertEquals("test123,(PDOUtil.getValueAsString(pdoNew, LogicalFieldEnum.P_TX_CTGY))); …
Run Code Online (Sandbox Code Playgroud)

java junit mockito

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

java.lang.LinkageError:ClassCastException

我确实遇到过TestNG和RESTeasy的烦人问题.

我有一个类,它针对API类运行多个测试,该类使用RESTeasy框架来暴露自己.

但是,如果我让测试运行maven(mvn test),那么我得到以下异常:

java.lang.LinkageError: ClassCastException: attempting to castjar:file:/C:/Users/rit/.m2/repository/org/jboss/resteasy/jaxrs-api/2.3.0.GA/jaxrs-api-2.3.0.GA.jar!/javax/ws/rs/ext/RuntimeDelegate.classtojar:file:/C:/Users/rit/.m2/repository/org/jboss/resteasy/jaxrs-api/2.3.0.GA/jaxrs-api-2.3.0.GA.jar!/javax/ws/rs/ext/RuntimeDelegate.class
at javax.ws.rs.ext.RuntimeDelegate.findDelegate(RuntimeDelegate.java:126)
at javax.ws.rs.ext.RuntimeDelegate.getInstance(RuntimeDelegate.java:96)
at javax.ws.rs.core.Response$ResponseBuilder.newInstance(Response.java:394)
at javax.ws.rs.core.Response.status(Response.java:116)
at javax.ws.rs.core.Response.status(Response.java:130)
at com.pd.api.TokenAPI_V1.validateAccessToken(TokenAPI_V1.java:141)
at com.test.pd.api.TokenAPI_V1Test.testIfValidAccessTokenReturnsCorrectHTTPHeadersWhenTokenIsNotFound(TokenAPI_V1Test.java:359)
Run Code Online (Sandbox Code Playgroud)

测试只是调用API obejct的方法,该方法返回一个Response对象(来自RESTeasy).作为测试框架,我使用TestNG.

测试方法

@Test
public void testIfValidAccessTokenReturnsCorrectHTTPHeadersWhenTokenIsNotFound() throws InvalidAccessTokenException {
    Mockito.when(tokenService.validateAccessToken(TestConstants.ACCESS_TOKEN)).thenThrow(new InvalidAccessTokenException());

    Response response = tokenAPI_v1.validateAccessToken(TestConstants.ACCESS_TOKEN, TestConstants.USER_AGENT);
    assert "no-store".equals(response.getMetadata().getFirst("Cache-Control"));
    assert "no-cache".equals(response.getMetadata().getFirst("Pragma"));
}
Run Code Online (Sandbox Code Playgroud)

问题说明

看起来RESTeasy框架在不同的类加载器中加载RuntimeDelegate.如果我看一下源代码,那么在RuntimeDelegate(包括第126行)中有以下方法:RuntimeDelegate.java.

因此,与错误相关的主要语句是instanceof check:

if (!(delegate instanceof RuntimeDelegate))
Run Code Online (Sandbox Code Playgroud)

如果我检查委托实例的类加载器与RuntimeDelegate的类加载器,那么我得到以下输出:

delegate.getClass().getClassLoader() -> org.powermock.core.classloader.MockClassLoader@31e46a68

RuntimeDelegate.class.getClassLoader() -> sun.misc.Launcher$AppClassLoader@3c0fabe9
Run Code Online (Sandbox Code Playgroud)

我知道这当然不起作用,但我想知道为什么RESTeasy的东西被加载到MockClassLoader而不是另一个.特别是因为我没有模拟被测试的TokenAPI.

奇怪的事实

奇怪的是,当我从IntelliJ运行测试时(我选择只运行包含产生错误的方法的给定类的所有测试),然后它就会运行.看起来它与mvn测试运行maven项目中的所有测试(或者至少我认为是这样)的事实有某种关系.

java testng classloader mockito powermock

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

反序列化 Kotlin 枚举,同时忽略未知值

我有一个枚举,我想使用 kotlinx.serialization 从 JSON 反序列化它,同时忽略未知值。这是枚举

@Serializable
enum class OperatingMode {
    Off, On, Auto
}
Run Code Online (Sandbox Code Playgroud)

我所说的忽略未知数的意思是,如果 JSON 对象中有一个或多个模式不在该枚举中,则应将它们视为不存在:

@Serializable
enum class OperatingMode {
    Off, On, Auto
}
Run Code Online (Sandbox Code Playgroud)

我通过编写自定义序列化器来实现这一点,但对于这样一个简单的任务来说,它似乎相当冗长

internal object OperatingModeSafeSerializer : KSerializer<OperatingMode?> {
    override val descriptor = PrimitiveSerialDescriptor("OperatingMode", PrimitiveKind.STRING)

    override fun serialize(encoder: Encoder, value: OperatingMode?) {
        // safe because @Serializable skips null fields
        encoder.encodeString(value!!.name)
    }

    override fun deserialize(decoder: Decoder): OperatingMode? {
        val string = decoder.decodeString()
        return try {
            OperatingMode.valueOf(string)
        } catch (_: Exception) {
            null
        }
    }
}

internal object …
Run Code Online (Sandbox Code Playgroud)

enums serialization fallback kotlin

10
推荐指数
2
解决办法
7615
查看次数

如何使用 JEP 412 从 Java 17 调用 C 函数:外部函数和内存 API

有没有人有一个关于如何从 Java 17 调用 C 函数(包括创建 C 库以及如何设置 MethodHandle)的简单示例?

https://openjdk.java.net/jeps/412上的 JEP 描述确实有一个示例,但我一直在努力理解它。

我认为可以使用巴拿马项目(https://jdk.java.net/panama/)jextract来实现,但由于该功能已包含在 JDK 中,因此我不想使用巴拿马。

c java project-panama

10
推荐指数
1
解决办法
3507
查看次数