gpt4 book ai didi

java - 在 jMock 中捕获方法参数以传递给 stub 实现

转载 作者:搜寻专家 更新时间:2023-10-30 21:19:32 25 4
gpt4 key购买 nike

我希望实现以下行为。我的被​​测类依赖于其他一些类,我希望用 jMock 模拟这种依赖性。大多数方法会返回一些标准值,但有一种方法,我希望调用 stub 实现,我知道我可以从 will(...) 调用此方法但我希望该方法由传递给模拟方法的完全相同的参数调用。

测试

@Test
public void MyTest(){
Mockery context = new Mockery() {
{
setImposteriser(ClassImposteriser.INSTANCE);
}
};
IDependency mockObject = context.mock(IDependency.class);
Expectations exp = new Expectations() {
{
allowing(mockObject).methodToInvoke(????);
will(stubMethodToBeInvokedInstead(????));
}
};
}

界面

public interface IDependency {
public int methodToInvoke(int arg);
}

要调用的方法

public int stubMethodToBeInvokedInstead(int arg){
return arg;
}

那么我如何捕获传递给被模拟方法的参数,以便我可以将它们传递给 stub 方法呢?

编辑

再举一个例子,假设我希望在以下 (C#) 代码中模拟 INameSource 依赖项,以测试 Speaker 类

public class Speaker
{
private readonly string firstName;
private readonly string surname;
private INameSource nameSource ;
public Speaker(string firstName, string surname, INameSource nameSource)
{
this.firstName = firstName;
this.surname = surname;
this.nameSource = nameSource;
}
public string Introduce()
{
string name = nameSource.CreateName(firstName, surname);
return string.Format("Hi, my name is {0}", name);
}
}
public interface INameSource
{
string CreateName(string firstName, string surname);
}

This is how it can be done in Rhino Mocks for C#我知道这不会那么容易,因为 Java 中缺少委托(delegate)

最佳答案

Duncan 的解决方案效果很好,但还有一个更简单的解决方案,无需借助自定义匹配器。只需使用传递给 CustomActions invoke 方法的 Invocation 参数。在这个参数中,您可以调用 getParameter(long i) 方法,该方法为您提供调用的值。

所以不是这个

return matcher.getLastValue();

用这个

return (Integer) invocation.getParameter(0);

现在您不再需要 StoringMatcher:Duncan 的示例现在看起来像这样

@RunWith(JMock.class)
public class Example {

private Mockery context = new JUnit4Mockery();

@Test
public void Test() {

final IDependency mockObject = context.mock(IDependency.class);

context.checking(new Expectations() {
{
// No custom matcher required here
allowing(mockObject).methodToInvoke(with(any(Integer.class)));

// The action will return the first argument of the method invocation.
will(new CustomAction("returns first arg") {
@Override
public Object invoke(Invocation invocation) throws Throwable {
return (Integer) invocation.getParameter(0);
}
});
}
});

Integer test1 = 1;
Integer test2 = 1;

// Confirm the object passed to the mocked method is returned
Assert.assertEquals((Object) test1, mockObject.methodToInvoke(test1));
Assert.assertEquals((Object) test2, mockObject.methodToInvoke(test2));
}

public interface IDependency {
public int methodToInvoke(int arg);
}

关于java - 在 jMock 中捕获方法参数以传递给 stub 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12211030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com