Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#单元测试中,Java';s Spy(而不是Mock)只模拟类上的某些方法?_C#_.net_Visual Studio_Unit Testing_Mocking - Fatal编程技术网

在C#单元测试中,Java';s Spy(而不是Mock)只模拟类上的某些方法?

在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

在Java中,当我有一个类调用另一个类的静态方法时,我总是封装它,这样我就可以测试它,而不需要实际访问那个真正的资源。例如:

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);