Java和.NET的测试与模拟框架

4

我想知道您对广泛使用并在Java和.NET之间具有良好兼容性的测试/模拟框架的看法。我的意思是,我想学习这些工具,以在.NET项目中使用,但我仍然希望能够将这些知识应用于Java项目。

  • 我知道在SO上有许多关于这些平台特定的测试/模拟框架的问题,但我还没有找到一个问题来比较这些框架在这两个平台上的相似之处。
8个回答

5

N/J系列框架(NUnit/JUnitNMock/JMock等)通常是彼此平行的或基于相同的起始原则。这些框架可以让你在它们之间转移至少一些知识。


1
值得一提的是,JMock2与其克隆版本NMock所基于的JMock1有着显著的不同。它不再使用字符串作为方法名称。 - Steve Freeman

5
我建议你看一下.NET中的模拟工具Moq。它在概念上与Java端的Mockito非常相似。

4

从我的Java方面经验来看,以下是我所见到的情况。

单元测试框架

至于Java中的单元测试,几乎每个人都在使用JUnit,并且使用注释的JUnit 4.0现在更像NUnit了。

Mocking框架

我们在项目中使用EasyMock大约半年时间,我们发现它花费了我们很多时间来完成简单的任务。实际上,我们开了很多关于EasyMock不易用的玩笑。

在参加了一次有关mocking框架的讲座后,我决定选择Mockito并且再也没有回头过。它可以轻松地进行部分mocking - 这是EasyMock需要一个单独的库才能实现的。此外,Mockito具有更好的错误消息。当您做错事时,它会给出详细的错误信息,告诉您如何违反了Mockito的合同。

无论如何,请尝试两者,并且我认为您会同意Mockito是明显的获胜者。


+1 对于Mockito。它比EasyMock更好,因为您可以使用更少的实现进行模拟。 - guerda

2
NMock在.NET世界中并不是最好的mock框架。它是基于字符串的:
Expect.Once.On(mockView).GetProperty("FromAccount").Will(Return.Value("1234"));

我强烈建议使用更加现代的工具,例如Rhino.Mocks
Expect.Call(mockView.FromAccount).Returns("1234");

2
首先,重要的是要区分“测试”和“模拟”的概念。对于单元测试(驱动测试),最流行的选择是Java的JUnit和.NET的NUnit。而在模拟(或隔离)框架方面情况更为复杂。
模拟框架分为两派,我称之为“传统”和“替代”。传统框架主要依赖于可测试性设计和依赖注入。而替代框架则依赖于诸如Profiling API或Java 5 SE仪器化特性(java.lang.instrument包)来在运行时修改CIL或字节码,从而使任何依赖项都可以进行模拟。
这种替代网络的例子有.NET的Typemock Isolator和Java的JMockit(Typemock除非在开源项目中使用,否则需要付费)。
关于.NET的传统模拟框架,目前最流行的两个是RhinoMocksMoq。这两个框架都大量依赖C# 3.0特性,特别是lambda语法,以允许简洁地指定模拟对象的行为和期望。

很好的回答!只有一个小修正:JMockit项目在去年十月份迁移到了Google Code;当前的URL是http://code.google.com/p/jmockit。 - Rogério
Rogerio:谢谢您的纠正!我对.NET的东西比Java更了解。 - azheglov

2

我们在.NET项目中使用RhinoMocks和NUnit。JUnit是Java的替代选择。


1

我在一些Java项目中使用了EasyMock,非常喜欢它。 似乎有一个.net端口,但我个人还没有使用过。

关于单元测试,我使用JUnit 4.x,与3.x相比具有一些不错的扩展功能。我猜NUnit提供类似的功能,但我也没有使用过。


0

我们使用MbUnit和Rhino.Mocks进行测试。我非常喜欢它。

我们使用MbUnit的原因是因为Reflector..或许在NUnit中也可以找到,但我先在MbUnit中发现了它;)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接