在Java中编写方法时(例如在论坛,邮件列表,问题跟踪器等中),许多人使用'#'符号而不是Java的本机.运算符将方法名称与类名分开; 例如,人们提到Object#toString而不是Object.toString.这种语法来自哪里?
我正在使用jUnit来管理访问数据库的应用程序的集成测试.因为设置测试数据是一项耗时的操作,所以我在@BeforeClass方法中一直这样做,每个测试类只执行一次(与@Before每个测试方法运行一次的方法相反).
现在我想尝试一些不同的排列来配置数据层,在每个不同的配置上运行我的所有测试.这似乎是Parameterized测试跑步者的自然使用.问题是,Parameterized为类构造函数提供参数,该@BeforeClass方法是抽象的,并在类构造函数之前调用.
几个问题,
是否Parameterized调用@BeforeClass的参数的每个排列方法,还是只调用一次?
如果@BeforeClass重复调用该方法,是否有某种方法可以从内部访问参数值?
如果不是这些,人们认为什么是解决这个问题的最佳替代方法?
我正在使用Jar Jar Links中的Ant任务在我的可分发jar文件(example.jar)中嵌入来自第三方jar文件(objenesis)的类.Jar Jar会将原始包(org.objenesis)中的类翻译成我选择的类.
它工作但它在可分发的jar中留下空目录.
这是一个简化的build.xml:
<target name="jar" depends="compile">
<taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask"
classpath="lib/jarjar-1.1.jar"/>
<jarjar jarfile="dist/example.jar" excludes="org.objenesis.**">
<fileset dir="build/classes/main"/>
<zipfileset src="lib/objenesis-1.2.jar"/>
<rule pattern="org.objenesis.**" result="org.thirdparty.@1"/>
</jarjar>
</target>
Run Code Online (Sandbox Code Playgroud)
example.jar的内容示例包括(如预期):
org/thirdparty/Objenesis.class
org/thirdparty/ObjenesisBase.class
Run Code Online (Sandbox Code Playgroud)
还有这些空目录(不合需要的):
org/objenesis/
org/objenesis/instantiator/
org/objenesis/instantiator/basic/
Run Code Online (Sandbox Code Playgroud)
我的问题:如何排除这些空目录?
我尝试了"zap"选项(在doc中列出),但是没有用.
我正在尝试为我正在开发的开源项目创建一个API,并且我在尝试扩展API时遇到了速度提升,同时保持语义与当前API一致.我希望能够使用通用参数定义方法签名,该参数接受调用任何方法签名的结果." 任何 ",意味着包括void方法.我已经知道你不能直接定义参数类型了void- 请不要重复明显的事实.不明显的是,是否有任何技巧void可以将方法调用作为方法的参数提供(即,忽略).
后面的故事,所以这更有意义,为什么我想要做这样的事情,以及我的设计目标和约束是什么,以防上述情况不可能(我担心的是):
我当前的API定义了一个非常可重复的方法模式,如下所示:
public <T,V> Function<T,V> functionFor(V ignoredRetVal) {...}
public <T> Predicate<T> predicateFor(V ignoredRetVal) {...}
public <T> Filter<T> filterFor(V ignoredRetVal) {...}
Run Code Online (Sandbox Code Playgroud)
顾名思义,参数被忽略,甚至在实现中都没有使用.在使用中,ignoredRetVal替换为对动态代理的方法调用.由于在调用方法之前评估参数,因此在外部函数(functionFor或predicateFor等)之前调用此动态代理方法.动态代理调用记录被调用的Method(或方法链),并将其转换为Function对象(Guava)或来自多个功能库的其他类似函数的对象.
我现在要做的是创建一个类似的语义来捕获仅用于副作用的方法调用,而不需要返回类型(例如Functional Java的 Effect.如果提供了非void返回类型,则忽略它如果提供了void返回类型,它也被忽略并被接受.关键是语义必须以某种方式强制在另一个提取截获的代理方法调用的方法之前调用代理方法.并且因为我们只对side感兴趣效果,候选方法可能包括void方法.理想情况下,它看起来像:
public <T, V> Effect<T> effectFor(V ignoredRetVal) {...}
Run Code Online (Sandbox Code Playgroud)
(已经适用于非void返回类型),它可以使用如下:
Effect<MyClass> effect1 = effectFor (proxyOfMyClass.nonVoidMethod());// OK :-)
Effect<MyClass> effect2 = effectFor (proxyOfMyClass.orVoidMethod()); // Problem!!
Run Code Online (Sandbox Code Playgroud)
正如我所说,我担心我所寻找的语义不能直接支持.如果没有,那么任何替代方案都应该与我建立的模式精神上接近.此外,我的API的整个目标是减少内部类实现的"垂直噪声",我不是Double Brace Initializers的粉丝.无论提供什么建议,我都在寻找支持简洁的语义,尤其是单语句语义.
我在StackOverflow上的第一个问题.我希望能够做到这样的事情:
SomeClass mock = mock(SomeClass.class);
String methodName ="someMethod"; 或方法方法= ... someMethod ...
这两件事(模拟和方法)将结合起来执行以下操作:
当(mock.someMethod())thenReturn(空).
当然,'null'值会根据我的需要进行相应更改,但我想确定两件事:
1),它甚至有可能做一些像这样在Java中? 这 =将类对象和方法组合到methodCall中.
2)我怎么做这样的事情?
我无休止地研究了这个,我找不到任何东西.问题是即使这适用于常规类和常规方法(someClass和someMethod会聚在一起做someClass.someMethod()),请记住,这必须与模拟对象一起使用才能在when中使用( )打电话.
答案:when(method.invoke(mock)).thenReturn("Hello world."); 是正确的语法和反射确实在when()调用内工作.谢谢Kevin Welker!
我们使用提供的GWT SimplePager来提供数据集的记录/页面导航.我们想要测试我们正确控制Next/Previous按钮的启用状态.虽然SimplePager让我们指定启用/禁用图像的按钮,"按钮"本身是一个内部类的ImageButton延伸Image,而不是按钮.因此,生成的HTML不使用Button启用/禁用属性,而是为每个状态提供不同的嵌入图像.
有没有合理的方法来检测Selenium中的SimplePager导航按钮启用状态?
我知道纯函数式编程的目标之一是消除可变性,从而排除副作用.但是让我们面对现实吧,即使存在所有的函数式编程库,Java也不是一种函数式语言.事实上,似乎有些FP库知道并期待这一点.例如,在Functional Java中,有一个Effect类.在Jedi FP库中,有Command界面.这允许您 - 除其他外 - 将类型安全的命令模式应用于Iterable没有令人讨厌的for循环样板的元素.
Command<PhoneNumber> makeCall = new Command<PhoneNumber> {
public void execute(PhoneNumber p) { p.call(); }
}
List<PhoneNumber> phoneList = ...
FunctionalPrimitives.forEach( phoneList, makeCall );
Run Code Online (Sandbox Code Playgroud)
所以问题是,番石榴中有类似的东西吗?
在接受澄清后接受回复
我正在开发一个框架,它可以帮助解决大多数Java FP库中固有的"垂直问题",在某些情况下.所以,我不竟让如上图所示的代码示例:即明确宣布一个新的类实现的Command所有其垂直噪声过甜的烦躁,只需在声明之后立即应用它的目的.
我更多地考虑实际的命令模式,其中可能有几个可能的命令在其他地方声明,并且只有其中一个被传递到想要迭代应用它的代码中.此外,我的框架的目标是使创建功能接口对象(函数,谓词,命令,其他简单的lambda)更加惯用,而不是简单地将垂直问题移动到其他地方.我早就意识到这不在番石榴的范围内.但是由于其他FP库中有类似Command的接口,我只想知道Guava中是否存在模拟.
使用我的框架的更完整的代码示例可能是这样的:
class Stuff {
private final Stuff CALLS_TO = callsTo(Stuff.class); // a proxy
public static final Command<Stuff> CMD1 = commandFor(CALLS_TO.someMethod1());
public static final Command<Stuff> CMD2 = commandFor(CALLS_TO.someMethod2());
// methods exist for use elsewhere, but …Run Code Online (Sandbox Code Playgroud) 这可能更像是Gradle问题而不是Caliper问题,但我仍然是Gradle的新手.我有兴趣在我的构建中提供一个可以使用Caliper运行一些基准测试的任务.我已经将Caliper添加到我的testCompile依赖项中,并且可以正常工作并将所有内容都删除.我想知道如何提供一个实际运行基准的任务.
顺便说一句,我已经知道卡尺了.我确实有一个Jenkins构建,但是它在云服务上还不允许我配置caliper-ci的使用,此外,我希望能够在提交对云的更改之前在本地运行.
我的情况有点复杂,不知道如何处理。有一个带有私有变量映射的对象(该对象已被初始化)。这个类有一系列对地图的操作。
我需要编写一个单元测试。它将获取私有变量,模拟(或监视)它,对其执行一些操作,并验证操作的顺序。什么是最好的方法?
public class A{
private Map<String, String> map = new Map()<>;
public void method1(){
map.put("a", "A");
}
public void method2(){
if(map.size() > 0){
map.put("b", "B");
}
}
...
public class UnitTester{
@Test
public void test(){
A ainstance = new A();
Map<String,String> mock = mock(Map.class); //OR Map<String,String> mock = spy(Map.class);
Field f= A.class.getDeclaredField("map");
f.setAccessible(true);
f.set(ainstance, mock);
ainstance.method1();
ainstance.method2();
InOrder inOrder = inOrder(mock);
inOrder.verify(mock, times(2), put(anyString(), anyString())); //Does not work
}
Run Code Online (Sandbox Code Playgroud)
map.put不会在地图中添加任何内容。不确定这是因为它是反射对象还是有其他原因。
我们的问题是这样的:我们希望将不同的枚举类型传递给方法,并在类型上调用values()方法.
public enum Testing {
A, B, C, D
}
public enum Retesting {
E, F, G, H
}
public static Object[] getValues(Enum e) {
return e.values(); // ! Compilation Error
}
public static void main(String[] args) {
Testing t = Testing.A;
getValues(t);
}
Run Code Online (Sandbox Code Playgroud)
有谁知道应该如何实现这样的事情,或者它是否可能实现?
谢谢
java ×8
mockito ×2
reflection ×2
ant ×1
caliper ×1
class ×1
enums ×1
forum ×1
gradle ×1
guava ×1
gwt ×1
jarjar ×1
junit ×1
junit4 ×1
mailing-list ×1
methods ×1
parameters ×1
return-type ×1
selenium ×1
side-effects ×1
unit-testing ×1
void ×1