为什么关于"部分嘲笑"以及需要它的代码会有如此多的仇恨?
这是一个(理论上)示例实现:
public ComplexResult1 operationA(Stimulus a) {
{
...
result = ...;
}
auditTheChange(a);
}
public ComplexResult2 operationB(Stimulus b) {
{
...
result = ...;
}
auditTheChange(b);
return result;
}
void auditTheChange(Stimulus stim) {
// do a bunch of stuff to record the change
// and interact with another outside service
}
Run Code Online (Sandbox Code Playgroud)
现在,根据我的理解,这是重构良好的代码.
如果我想UNIT测试operationA和operationB,并确保在每个场景中都进行审计,但不必测试审计代码的细节,我会使用部分模拟.
我没有看到/理解导致如此多的项目(EasyMock,Mockito等)推荐重构?
我有一个包含公共方法的类,它依赖于内部方法以正确返回其值.
让我们考虑以下类和测试文件:
public class ClassUnderTest
{
public string NotMockedPublicMethod()
{
return MockedMethod();
}
virtual public string MockedMethod()
{
return "original";
}
}
Run Code Online (Sandbox Code Playgroud)
以下测试用例可行:
var mock = new Mock<ClassUnderTest> { CallBase = true };
mock.Setup(m => m.MockedMethod()).Returns("mocked");
Assert.AreEqual("mocked", mock.Object.NotMockedPublicMethod());
Run Code Online (Sandbox Code Playgroud)
但是,让我们说我的这个MockedMethod()在外部没有效用.问题是将此方法标记为internal(即使使用InternalsVisibleTo()正确):
virtual internal string MockedMethod()
Run Code Online (Sandbox Code Playgroud)
将使完全相同的测试失败并显示消息Assert.AreEqual failed. Expected:<mocked>. Actual:<original>.
这是Moq的bug还是有些限制?
以下是我的课
public class SomeClass {
public ReturnType1 testThisMethod(Type1 param1, Type2 param2) {
//some code
helperMethodPublic(param1,param2);
//more code follows
}
public ReturnType2 helperMethodPublic(Type1 param1, Type2 param2) {
//some code
}
}
Run Code Online (Sandbox Code Playgroud)
所以在上面的类中测试testThisMethod()时,我想部分模拟helperMethodPublic().
截至目前,我正在做以下事情:
SomeClass someClassMock =
PowerMock.createPartialMock(SomeClass.class,"helperMethodPublic");
PowerMock.expectPrivate(someClassMock, "helperMethodPublic, param1, param2).
andReturn(returnObject);
Run Code Online (Sandbox Code Playgroud)
编译器没有抱怨.所以我尝试运行我的测试,当代码命中helperMethodPublic()方法时,控件进入方法并开始执行那里的每一行代码.我该如何防止这种情况发生?
我在使用jmockit时出现以下情况时遇到问题.在网上做过研究,但还没找到答案.
在记录阶段,我正在设置对部分模拟的对象的期望.在做的时候,我想用单个参数模拟一个私有方法.但我真的不关心那个参数值.我希望将该特定私有方法的所有调用与传递给它的任何参数实例进行匹配.我怎么在Jmockit中做到这一点.有办法吗?
new Expectations(student) {
{
Deencapsulation.invoke(student, "setDepartment", (Department) any);
result = new Delegate<Student>() {
public void setDepartment(Department dept) {
System.out.println("Mocked setDepartment() methodd.....");
}
};
}
};
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,(Department) any不能传递,因为Deencapsulation.invoke(...)方法不接受null值.
我有一个用户控件,它在我想测试的ValidateChildren方法中做了一些验证.我创建了一个用户控件的部分模拟,但是虽然我没有对ValidateChildren方法设置任何期望,但我只是调用它,它只是被跳过而且方法中的代码永远不会执行.为了尝试了解发生了什么,我创建了一个简单的测试,如下所示:
public class Foo
{
public virtual bool Method1()
{
throw new NotImplementedException();
}
public virtual bool Method2()
{
return Method1();
}
}
Run Code Online (Sandbox Code Playgroud)
并用它来测试它:
[Test]
public void TestFooMethods ()
{
MockRepository m = new MockRepository();
Foo foo = m.PartialMock<Foo>();
RhinoMocksExtensions.Expect<Foo,bool>(
foo,
delegate (Foo obj)
{
return obj.Method1();
}
).Return(true);
Assert.IsTrue (foo.Method2());
}
Run Code Online (Sandbox Code Playgroud)
现在我希望foo.Method1被嘲笑和foo.Method2不是.但是这总是返回false,如果我尝试在调试器中逐步执行foo.Method2(),我就不能介入它了.
有什么想法吗?
c# ×2
java ×2
mocking ×2
.net ×1
jmockit ×1
junit ×1
moq ×1
powermock ×1
refactoring ×1
rhino-mocks ×1
unit-testing ×1