它不算作自动模拟,但您确实也问过“或者有没有办法覆盖行为?” 和“也许我忽略了一个更简单的解决方案?”
该答案取决于您问题中的陈述:
SomeObj
是您无法控制的类,我认为它要么单独测试,要么不可测试
SomeObj
有一个默认构造函数
当然,它要求您“在测试之前手动初始化模拟”,但由于您没有告诉我们这个对象是什么,所以不可能知道完全实现需要多少工作。
public class SomeObj
{
// Non-virtual to prevent auto-mocking
public void Dummy() { }
}
public interface ISomething
{
SomeObj First { get; }
SomeObj Second { get; }
}
[TestMethod]
public void Test_17182355ms()
{
ISomething mockedSomething = Substitute.For<ISomething>();
SomeObj firstObj = mockedSomething.First;
Assert.IsNull(firstObj);
mockedSomething.First.Returns(new SomeObj());
mockedSomething.Second.Returns(new SomeObj());
firstObj = mockedSomething.First;
Assert.IsNotNull(firstObj);
}
另一种方法,虽然不是没有自己的缺点,是为 提取你自己的接口SomeObj
,如下所示:
public interface ISomeObj
{
void Dummy();
}
public class MySomeObj : SomeObj, ISomeObj
{
}
然后ISomeObj
在你的测试中模拟。