我有一个方法,有时会抛出异常:
this.items[index] = element;
Run Code Online (Sandbox Code Playgroud)
我有一个单元测试断言应该抛出的异常实际抛出:
try
{
doSomethingWithIndex(-1);
Assert.fail("should cause exception");
}
catch (IndexOutOfBoundsException expected)
{
Assert.assertNotNull(expected.getMessage());
}
Run Code Online (Sandbox Code Playgroud)
此测试作为连续构建的一部分运行,有时偶尔会失败,因为getMessage()实际上返回null.为什么会这样?我的代码永远不会抛出空消息的异常.
编辑
我的原始代码示例具有误导性,抛出的异常实际上来自直接索引数组.我可以使用自定义抛出异常重现相同的行为.
我添加了建议的代码:
catch (IndexOutOfBoundsException expected)
{
if (expected.getMessage() == null)
{
expected.printStackTrace();
}
Assert.assertNotNull(expected.getMessage());
}
Run Code Online (Sandbox Code Playgroud)
除原因外,控制台输出缺少堆栈跟踪.这是完整的输出:
java.lang.ArrayIndexOutOfBoundsException
Run Code Online (Sandbox Code Playgroud) 我的团队在一个包含大约20,000个Java文件的cvs项目中工作.由于文件数量的原因,需要一段时间才能进行cvs更新.我通常会检查整个树的大约5个副本,以便于检查不同的请求,而不必担心每个文件都被修改了哪些文件.让所有5棵树保持最新并且彼此同步真的很痛苦.
我已经读过,使用远程cvs服务器在本地使用git相当容易,而且git很快.请问git会显着加快我当地树木的更新速度吗?
我意识到下限是进行一次cvs更新的时间.但是我想,一旦第一棵树是最新的,就可以快速地将其他4与第一棵树同步,而不是再做4个cvs更新命令.我能正确理解git吗?
我有两个分支,我一直在上游/主人.一个分支将另一个分支作为祖先,因此它们形成一条线.
U1 (upstream/master)
\
A -- B (fixes)
\
C -- D (features)
Run Code Online (Sandbox Code Playgroud)
后来,上游/大师向前迈进......
U1 -- U2 (upstream/master)
\
A -- B (fixes)
\
C -- D (features)
Run Code Online (Sandbox Code Playgroud)
...而且我想要将两个分支机构重新加入.
U1 -- U2 (upstream/master)
\
A' -- B' (fixes)
\
C' -- D' (features)
Run Code Online (Sandbox Code Playgroud)
我知道两种方法,每种方法都有缺点.
git rebase upstream/master fixes
git rebase fixes features
Run Code Online (Sandbox Code Playgroud)
这两个命令有时会起作用,有时会在第二个命令上给出合并冲突.
git rebase upstream/master features
# figure out the hash code of the new commit corresponding with B'
git branch -f fixes <sha of B'>
Run Code Online (Sandbox Code Playgroud)
这只涉及一个rebase,但移动分支是繁琐且容易出错的.
我查看了rebase --preserve-merges,但这似乎不适用,因为没有合并提交. …
我正在尝试为Scala编写性能测量库.我的想法是透明地"标记"部分,以便可以收集执行时间.不幸的是我无法按照我的意愿弯曲编译器.
一个公认的例子,说明了我的想法:
// generate a timing function
val myTimer = mkTimer('myTimer)
// see how the timing function returns the right type depending on the
// type of the function it is passed to it
val act = actor {
loop {
receive {
case 'Int =>
val calc = myTimer { (1 to 100000).sum }
val result = calc + 10 // calc must be Int
self reply (result)
case 'String =>
val calc = myTimer { (1 to 100000).mkString …Run Code Online (Sandbox Code Playgroud) 我在subversion控件下有一个目录.我创建了一个分支,只是为了测试合并的东西.我拿了一个文件,修改后备箱中的X行为"abc",并在其分支中修改了与"def"相同的X行.
然后,从分支工作目录我做了:
svn merge branchURL trunkURL .
Run Code Online (Sandbox Code Playgroud)
它更新了该文件,内容为该行号的"abc",即svn update如果我在同一个工作目录中完成它并且有人提交了" c",那么就不会给我一个相同行号的冲突.def"在存储库中.
那么svn merge在合并时只是替换内容而不会带来任何冲突吗?
如果是这样的话,当一个人不能以某种方式合并以便保持主干和分支的变化时,从主干分支出一个项目的原因将是无用的.
有没有办法让我只为它构建的java类运行单元测试?例如,如果MyClass.java已过期,则ant将构建MyClass.class.之后,我希望它也运行MyClassTest和MyClassTestSuite(如果它们存在).它不必基于命名约定.我可以使用注释或任何其他有效的方法.
编辑:有几个人说这是一个坏主意.如果我计划在没有运行所有单元测试的情况下办理登机手续,那就是这样.我的主项目有超过16,000个单元测试,大约需要20分钟才能运行.我会在办理登机手续之前运行它们,但每次更改文件时运行整个套件都是不切实际的.对不起,我应该给出更多背景信息.
在Scala中,调用groupBy()集合会返回Map值为集合的位置,但我想要一个MultiMap.什么是最简单的转换方式?我可以避免创建一个新的MultiMap并复制一切吗?
Java的任何代码覆盖工具是否允许您在引入新的未覆盖代码时导致构建失败?我不希望基于80%的任意截止值使构建失败,因为在大型代码库中,实际覆盖百分比很少波动.此外,如果覆盖率下降0.1%,很难分辨哪些是未覆盖的新线.
编辑
我确信不要让构建失败.问题的另一部分仍然存在.我怎样才能找到最近签入的未覆盖代码?
我正在尝试编写一个方法,该方法采用Map [K,Collection [V]]并将其转换为具有不同类型Collection的值的地图.该方法采用"multimap"和构建新集合的构建器.我这样使用它:
val multimap = new java.util.HashMap[Int, java.util.List[String]]
multimap.put(1, Arrays.asList("One"))
multimap.put(2, Arrays.asList("Two", "Three"))
val mapOfLists: java.util.Map[Int, java.util.Set[String]] =
asMap(multimap, Builder.SET)
Run Code Online (Sandbox Code Playgroud)
这是构建器的样子:
trait Builder[C[_] <: java.util.Collection[_]]
{
def create[V]: C[V]
}
object Builder
{
val SET = new Builder[java.util.Set]()
{
def create[V]: java.util.Set[V] = new java.util.HashSet[V]
}
}
Run Code Online (Sandbox Code Playgroud)
这是asMap()的实现.它有效,但我不明白 - 为什么我需要在最后输入类型?
def asMap[K, V, C[_] <: java.util.Collection[_]](
multimap: java.util.Map[K, _ <: java.util.Collection[V]], builder: Builder[C]): java.util.Map[K, C[V]] =
{
val result = new java.util.HashMap[K, C[V]]
val iterator: Iterator[K] = multimap.keySet.iterator
while …Run Code Online (Sandbox Code Playgroud) 我在这个形状的git中有两个分支.
* fffffff commit f
* ddddddd commit d
* bbbbbbb commit b
| * eeeeeee commit e
| * ccccccc commit c
| * aaaaaaa commit a
|/
* 2222222 base revision 2
* 1111111 base revision 1
Run Code Online (Sandbox Code Playgroud)
我想像使用rebase --interactive那样重新定义和重新排序提交.但是,我想交错几个提交,并结束这样的形状.
* ffffff2 commit f
* eeeeee2 commit e
* dddddd2 commit d
* cccccc2 commit c
* bbbbbb2 commit b
* aaaaaaa commit a
* 2222222 base revision 2
* 1111111 base revision 1
Run Code Online (Sandbox Code Playgroud)
有没有办法一步完成这个rebase?我尝试在两个步骤中通过在commit e之上重新设置提交b然后执行第二个交互式rebase来对所有提交进行排序.问题是我得到合并冲突(例如,在commit b和commit e之间),否则我将看不到(通过在提交之后放置提交b)并且不值得解决冲突.