假设我有一个内部方法的类:
if (!string.IsNullOrWhiteSpace(corrID?.ID))
{
context.Response.OnStarting((state) =>
{
context.Response.Headers.Add("Correlation-ID", corrID.ID);
return Task.FromResult(0);
}, context);
}
await _next(context);
实现接口的:
class MyClass : IMyClass
{
public void PublicMethod() { ... }
internal void InternalMethod() { ... }
}
一个包含interface IMyClass
{
void PublicMethod() { ... }
}
实例和其他具体类的容器类:
MyClass
class ContainerClass
{
public MyClass myClass;
...
}
由各种程序集使用。在与ContainerClass
相同的程序集中使用时,调用方法可以调用MyClass
为了使测试更易于模拟,我现在尝试用接口而不是具体类替换containerClass.myClass.InternalMethod()
的属性,例如:
ContainerClass
但是,如果我这样做,class ContainerClass
{
public IMyClass myClass;
...
}
将无法再使用InternalMethod
调用,因为该方法在接口上不存在...也不是可以,因为它是containerClass.myClass.InternalMethod()
。但是,我无法使接口内部,因为其他程序集也使用internal
。
假设我无法更改ContainerClass
对该方法的访问权限。还有另一种方式吗?
编辑:这与How to Mock the Internal Method of a class?不同,因为我没有尝试模拟内部方法,我试图在替换具体类时将其暴露(internal
)带有接口(MyClass
)。
答案 0 :(得分:3)
一个选项是创建两个接口,一个是公共接口,一个是内部接口:
public interface IMyClassPublic
{
void PublicMethod();
}
internal interface IMyClassInternal
{
void InternalMethod();
}
在MyClass
中实现它们(您需要明确地实现IMyClassInternal
,因为它是内部的):
public class MyClass : IMyClassPublic, IMyClassInternal
{
public void PublicMethod() { }
void IMyClassInternal.InternalMethod() { }
}
并更改ContainerClass
以便它分别公开两个接口(并且可能使myClass
私有):
public class ContainerClass
{
private MyClass myClass;
public IMyClassPublic myClassPublic
{
get
{
return myClass;
}
}
internal IMyClassInternal myClassInternal
{
get
{
return myClass;
}
}
}
现在您可以模拟它们,将内部方法用作containerClass.myClassInternal.InternalMethod()
,将公共方法用作containerClass.myClassPublic.PublicMethod()
。