在C#单元测试中,Java';s Spy(而不是Mock)只模拟类上的某些方法?
在Java中,当我有一个类调用另一个类的静态方法时,我总是封装它,这样我就可以测试它,而不需要实际访问那个真正的资源。例如:在C#单元测试中,Java';s Spy(而不是Mock)只模拟类上的某些方法?,c#,.net,visual-studio,unit-testing,mocking,C#,.net,Visual Studio,Unit Testing,Mocking,在Java中,当我有一个类调用另一个类的静态方法时,我总是封装它,这样我就可以测试它,而不需要实际访问那个真正的资源。例如: public class HasSomeStaticCall { public HasSomeStaticCall() { this.something = callStaticThing(); } protected String callStaticThing() { return SomeTh
public class HasSomeStaticCall
{
public HasSomeStaticCall()
{
this.something = callStaticThing();
}
protected String callStaticThing()
{
return SomeThirdParty.getFromStaticMethod();
{
}
在Java中,我可以使用Spy
而不是Mock
,然后使用除该方法之外的所有实际方法
例如:
public void test()
{
HasSomeStaticCall obj = Mockito.spy( HasSomeStaticCall.class );
//Only mock this one method
Mockito.doReturn( "SomeValue" ).when( obj ).callStaticThing();
}
在C#中,我将如何执行此操作?(我使用的是.Net Framework 4.7.x,而不是.Net Core)对于C#mocking框架,你没有间谍这样的概念。您可以做的是创建一个mock并将其安排为调用原始代码,其中调用静态方法的方法可以返回您想要的值。您应该记住,免费的C#mocking框架只适用于接口和虚拟方法。因此,如果您的案例是安排一个公共虚拟方法来返回一个值,那么这里就是如何实现的。我将在下面的示例中使用免费版本:
HasSomeStaticCall obj = Mock.Create<HasSomeStaticCall>(Behavior.CallOriginal);
Mock.Arrange(() => obj.callStaticThing()).Returns("SomeValue");
var actual = obj.callStaticThing();
Assert.AreEqual("SomeValue", actual);
我创建了一个Something属性来访问该字段的值,如果您有其他方法在需要时验证该值,则不需要该属性
如果您对JustMock感兴趣,可以检查JustMock和JustMock Lite的功能
免责声明。我是负责的开发人员之一。您可以使用库,例如
Moq
或AutoMock
,但是您必须将该方法标记为virtual
,或者实现一个接口来模拟该方法。在使用接口的情况下,您可以模拟将接口注入到类构造函数中。@谢谢。我正在使用Moq
,但是它在哪里有Spy
?hassomestaticcallobj=newmock();Setup(p=>p.callStaticThing()).Returns(“SomeValue”)
,假设callStaticThing具有以下签名
受保护的虚拟字符串callStaticThing()
。我从未使用过Java和Mockito,因此我不确定测试的结构,但这听起来像是您的意图。@ColinM是的,但我希望其余方法调用真实代码,而不是模拟代码。难道不把它当作一个嘲弄,让所有的方法都被嘲弄吗?见答案的第一段
HasSomeStaticCall obj = Mock.Create<HasSomeStaticCall>(Behavior.CallOriginal);
Mock.NonPublic.Arrange<string>(obj, "callStaticThingProtected").Returns("SomeValue");
var actual = obj.MethodThatCallsTheProtectedcallStaticThing();
Assert.AreEqual("SomeValue", actual);
Mock.Arrange(() => SomeThirdParty.getFromStaticMethod()).Returns("SomeValue");
HasSomeStaticCall obj = new HasSomeStaticCall();
var actual = obj.Something;
Assert.AreEqual("SomeValue", actual);