如果抛出异常而不是显示失败,或者我是否应该在线程内部没有断言,那么我做错了什么?
@Test
public void testComplex() throws InterruptedException {
int loops = 10;
for (int i = 0; i < loops; i++) {
final int j = i;
new Thread() {
@Override
public void run() {
ApiProxy.setEnvironmentForCurrentThread(env);//ignore this
new CounterFactory().getCounter("test").increment();//ignore this too
int count2 = new CounterFactory().getCounter("test").getCount();//ignore
assertEquals(j, count2);//here be exceptions thrown. this is line 75
}
}.start();
}
Thread.sleep(5 * 1000);
assertEquals(loops, new CounterFactory().getCounter("test").getCount());
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪
Exception in thread "Thread-26" junit.framework.AssertionFailedError: expected:<5> but was:<6>
at junit.framework.Assert.fail(Assert.java:47)
at junit.framework.Assert.failNotEquals(Assert.java:277)
at junit.framework.Assert.assertEquals(Assert.java:64) …Run Code Online (Sandbox Code Playgroud) 我正在看的assert()参考页,虽然我读给定的例子,我卡住了:
/* assert example */
#include <stdio.h>
#include <assert.h>
int main ()
{
FILE * datafile;
datafile=fopen ("file.dat","r");
assert (datafile);
fclose (datafile);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,如果datafile比较等于0,则assert用于中止程序执行,这在前一次调用fopen时不成功.
我完全同意,如果fopen()失败,assert()将中止执行.但是我担心这个例子的正确性:
在我看来assert()是检测通常不会发生的情况(比如传递一个NULL指向函数的指针,该函数的文档声明它是被禁止的).
在此示例中,无法打开文件不是通常不会发生的事情.事实上,我可以看到为什么会失败的几十个原因.该文件不存在,程序可以在没有所需权限的情况下运行,依此类推.
我宁愿做类似的事情:
/* not longer an assert example */
#include <stdio.h>
#include <assert.h>
int main ()
{
FILE * datafile;
datafile=fopen ("file.dat","r");
if (datafile != NULL)
{
// Do something, whatever.
fclose (datafile);
} else
{ …Run Code Online (Sandbox Code Playgroud) 让我们假设一段测试代码:
Observable model = Class.forName(fullyQualifiedMethodName).newInstance();
Observer view = Mockito.mock(Observer.class);
model.addObserver(view);
for (Method method : Class.forName(fullyQualifiedMethodName).getDeclaredMethods())
{
method.invoke(model, composeParams(method));
model.notifyObservers();
Mockito.verify(
view, Mockito.atLeastOnce()
).update(Mockito.<Observable>any(), Mockito.<Object>any());
}
Run Code Online (Sandbox Code Playgroud)
Mockito.verify如果模型中的Observable.setChanged()方法没有调用方法,则抛出异常.
问题:没有添加loggers/System.print.out我无法意识到当前测试失败的方法是什么.有没有办法与jUnit Assert方法类似:
Assert.assertEquals(
String.format("instances %s, %s should be equal", inst1, inst2),
inst1.getParam(),
inst2.getParam()
);
Run Code Online (Sandbox Code Playgroud)
解:
verify(observer, new VerificationMode()
{
@Override
public void verify(VerificationData data)
{
assertTrue(
format(
"method %s doesn't call Observable#setChanged() after changing the state of the model",
method.toString()
),
data.getAllInvocations().size() > 0);
}
}).update(Mockito.<Observable>any(), Mockito.<Object>any());
Run Code Online (Sandbox Code Playgroud) 我试图在我的程序中捕获失败的断言.我正在使用一个直接调用assert()的库,而不是自定义函数或宏,并且它在此库中我正在尝试跟踪几个与移植相关的错误.涉及的所有内容都使用g ++中的调试符号进行编译.
我找到的最好的解决方案是破坏文件:assert的行,以及assert表达式的条件.这允许在失败之前停止断言,但这是一个可怕的解决方案.它需要针对每个可能失败的断言进行特殊设置,不能在我的IDE中运行,并且通常需要付出太多努力.
如何以允许检查assert调用范围内的callstack和变量的方式使用gdb和gcc 中断任何失败的断言?
如果解决方案允许我放弃断言的失败并继续运行,那将会更好.
我使用Boost Test框架对我的C++代码进行单元测试,并想知道是否可以测试函数是否会断言?是的,听起来有点奇怪,但请忍受我!我的许多函数在输入时检查输入参数,断言它们是否无效,并且测试它是有用的.例如:
void MyFunction(int param)
{
assert(param > 0); // param cannot be less than 1
...
}
Run Code Online (Sandbox Code Playgroud)
我希望能够做到这样的事情:
BOOST_CHECK_ASSERT(MyFunction(0), true);
BOOST_CHECK_ASSERT(MyFunction(-1), true);
BOOST_CHECK_ASSERT(MyFunction(1), false);
...
Run Code Online (Sandbox Code Playgroud)
你可以检查使用Boost测试抛出的异常,所以我想知道是否还有一些断言魔法......
请看以下示例:
public void Foo()
{
//Code...
Debug.Assert(ExpensiveTest());
//Code...
}
Run Code Online (Sandbox Code Playgroud)
Debug.Assert在发布模式下编译时,该方法会发生什么?会ExpensiveTest()继续吗?如果没有,那么它是如何工作的(因为它不是一个可以设置为无评估的宏)?如果它确实运行,那么这是否会破坏调试断言的目的?
我的意思是,我需要做什么才能在我的代码中使用有用的断言?
MFC很简单,我只使用ASSERT(某物).
什么是非MFC方式?
编辑:是否有可能在assert.c中停止断言而不是我的调用assert()的文件?
编辑:<assert.h>&之间有什么区别<cassert>?
一般承认的答案:在这篇文章中有很多很棒的答案,我希望我能接受不止一个答案(或者有人将它们全部合并).所以答案会被授予Ferruccio(第一个答案).
在Java中,已知使用assert关键字通常是一个坏主意,因为它的行为依赖于运行时环境(默认情况下它不会执行任何操作,除非将-enableassertion传递给java运行时).
Groovy的主张是不同的吗?它总是在生产代码中执行,是否建议在生产代码中使用?(在Java中你会使用像Preconditions这样的东西)
从我的健全性测试来看,似乎默认情况下assert没有任何标志,并且它实际上比Java关键字更强大(参见Power Assert) - 我只是在寻找官方/完整答案,而不是我的轶事.
我正在查看Symfony2验证参考,但我找不到我需要的东西.
我有一个带有StartDate和EndDate的课程.我想添加一个\ @Assert(),它验证StartDate始终是BEFORE EndDate.是否存在将类属性作为验证约束进行比较的标准方法,还是应该创建自定义验证约束?
class Employment {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
* @Expose()
*/
protected $id;
/**
* @ORM\Column(type="datetime")
* @Expose()
* @Assert\DateTime()
*/
protected $startDate;
/**
* @ORM\Column(type="datetime", nullable=TRUE)
* @Expose()
* @Assert\DateTime()
*/
protected $endDate;
...
}
Run Code Online (Sandbox Code Playgroud) 似乎Swift没有类似C#/ Java的异常,而是使用断言.但是,该书说,在生产环境中,它们会立即使应用程序崩溃.周围没有办法吗?单元测试怎么样,如何测试某个函数断言它获得了正确的输入值?
assert ×10
c++ ×4
debugging ×3
java ×3
junit ×2
.net ×1
boost ×1
boost-test ×1
c ×1
c# ×1
debugbreak ×1
doctrine-orm ×1
exception ×1
g++ ×1
gdb ×1
groovy ×1
mockito ×1
php ×1
swift ×1
symfony ×1
try-catch ×1
unit-testing ×1
validation ×1
verify ×1