我有一个我想测试的Spring组件,这个组件有一个autowired属性,我需要更改它以进行单元测试.问题是,该类在后构造方法中使用自动装配的组件,因此在实际使用之前我无法替换它(即通过ReflectionTestUtils).
我该怎么办?
这是我要测试的类:
@Component
public final class TestedClass{
@Autowired
private Resource resource;
@PostConstruct
private void init(){
//I need this to return different result
resource.getSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
这是测试用例的基础:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= "classpath:applicationContext.xml")
public class TestedClassTest{
@Autowired
private TestedClass instance;
@Before
private void setUp(){
//this doesn't work because it's executed after the bean is instantiated
ReflectionTestUtils.setField(instance, "resource", new Resource("something"));
}
}
Run Code Online (Sandbox Code Playgroud)
在调用postconstruct方法之前,有没有办法用其他东西替换资源?想告诉Spring JUnit跑步者自动装配不同的实例?
我正在使用以下SureFire配置构建Maven项目:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${version.maven-surefire-plugin}</version>
<configuration>
<includes>
<include>**/*Test.java</include>
</includes>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
问题是,当我构建它时mvn clean install -DskipTests=true,测试仍在执行中.可能是什么问题呢?
我尝试了两个-DskipTests(来自Maven网站)-DskipTests=true,当我选中"跳过测试"复选框时,它由IntelliJ Idea添加.
我不使用任何Maven settings.xml.
编辑 如果我注释掉SureFire插件配置,该参数的行为与我期望的一样.上面的配置可能有什么问题?
我发现了类似的主题,但过于复杂,并不完全相同.事情就是这样.这是(最小)代码,它在1.6上很好,但不能用1.7 javac编译.
public class Test {
private static class A<T>{};
private static class B{};
private static class C{};
B doSomething(A<B> arg){
return new B();
}
C doSomething(A<C> arg){
return new C();
}
}
Run Code Online (Sandbox Code Playgroud)
在1.7上错误是这样的:
java: name clash: doSomething(Test.A<Test.C>) and doSomething(Test.A<Test.B>) have the same erasure
Run Code Online (Sandbox Code Playgroud)
我理解类型擦除以及为什么它是错误的代码.我只是不明白为什么我们可以在我们的项目中编译和运行1.6中的代码,当1.7有问题时.怎么了?这是1.6编译器中的一个错误,它允许我们这样做吗?是否有可能使其在重写以外的1.7中工作?
在intellij Idea中,我在Changes-> Repository选项卡中只看到了大约600个修订版.有没有办法增加这个数字?在设置中,我已取消选中
Version Control->Limit history by:
并设定
Version Control->Background->VCS History Cache Settings-> Changelists to cache initialy 到5000
但刷新VCS后,我仍然看到相同数量的修订.Version Control除了之外,设置中的其他选项未选中Notify about VCS root errors
我使用IntelliJ Idea 12.1.6,VCS是SVN 1.7
我正在使用intellij Idea来调试在tomcat上运行的应用程序.但我有一个问题,在某些类中,行断点不起作用(方法断点工作正常......但速度慢).我可以通过从方法断点或从另一个类步入类来检查特定的代码行或检查变量,但调试器不会在任何行上停止.(IntelliJ显示空的红色圆圈(没有交叉))
更新:此问题不仅限于Tomcat.我在Weblogic上遇到了与不同项目相同的问题.所以这可能是Idea或Java的问题.
可能的原因是什么?没有特殊的编译器选项,当我反编译类时,LineNumberTables和LocalVariableTables就在那里.这两个类(行断点很好,一个不行)在同一个包中.我的源完全匹配已部署的代码.我已经清除了所有intellij构思缓存(也是[system]/jars,这里建议:调试器不会停在Intellij IDEA的源代码中)
当我按照CrazyCoder的建议在Idea中启用调试器跟踪时,我得到了这些结果(当我在想法中添加/删除行断点时显示输出):
==== Enable Breakpoint ====
[JDI: Sending Command(id=25172) JDWP.EventRequest.Set]
[JDI: Sending: eventKind(byte): 8]
[JDI: Sending: suspendPolicy(byte): 1]
[JDI: Sending: modifiers(Modifier[]): ]
[JDI: Sending: modifiers[i](Modifier): ]
[JDI: Sending: modKind(byte): 5]
[JDI: Sending: classPattern(String): com.teamead.fwf.web.controller.ino.datauser.flightplan.EquipmentDefinition]
[JDI: Receiving Command(id=25172) JDWP.EventRequest.Set]
[JDI: Receiving: requestID(int): 23]
[JDI: Retrieving matching ReferenceTypes, sig=Lcom/teamead/fwf/web/controller/ino/datauser/flightplan/EquipmentDefinition;]
[JDI: Sending Command(id=25174) JDWP.VirtualMachine.ClassesBySignature]
[JDI: Sending: signature(String): Lcom/teamead/fwf/web/controller/ino/datauser/flightplan/EquipmentDefinition;]
[JDI: Receiving Command(id=25174) JDWP.VirtualMachine.ClassesBySignature]
[JDI: Receiving: classes(ClassInfo[]): ] …Run Code Online (Sandbox Code Playgroud) 我一直试图通过创建一个简单的单元测试来证明应用程序中存在一个错误,该测试将值放到地图上.我当时正在等待ConcurrentModificationException,但我所得到的只是在执行程序中悬挂线程,我看不出问题究竟在哪里.
测试在这里:
@Test
public void testHashMap() throws Exception {
final Random rnd = new Random();
final Map<String, Object> map = new HashMap<>();
ExecutorService executor = Executors.newFixedThreadPool(10);
for (int i = 0; i < 100; i++) {
final int counter=i;
executor.execute(new Runnable() {
@Override
public void run() {
try{
for (int j = 0; j<1000; j++){
map.put(String.valueOf(rnd.nextLong()), new Object());
//map.put("A", new Object());
}
System.out.println("Thread "+counter+" finished");
}catch(Exception e){
System.out.println("Thread "+counter+" failed with exception: ");
e.printStackTrace();
}
}
});
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Eclipse内存分析器查找可能的内存泄漏,但是当我搜索某些对象时,无法获取其堆大小,并且“浅堆/保留堆”列始终为空。

当我右键单击任何对象并执行“计算精确的保留大小”时,没有任何反应。在看到一些数据之前我需要运行某些东西吗?我在直方图中看到了保留的堆大小,但没有其他地方(如在控制树中)。
在我们的应用程序中,我们在ArrayList.add(Object o)操作上得到了一个ArrayIndexOutOfBounds异常.最明显的解释是线程安全,但我无法重新创建事件.我试过创建两个线程.在一个我添加元素,在另一个我正在删除它们(或清除数组),但我没有第二次得到异常.我的意思是很明显它可以通过查看ArrayList的源代码来实现,但是能够演示它会很好.
我已经运行了这个测试很长一段时间,没有任何例外:
public class Test {
static ArrayList a = new ArrayList();
public static void main(String[] args) throws Exception {
Thread t1 = new Thread() {
public void run() {
while (true) {
if (a.size() > 0)
a.remove(0);
}
}
};
Thread t2 = new Thread() {
public void run() {
while (true) {
a.add(new Object());
}
}
};
t2.start();
Thread.sleep(100);
t1.start();
}
}
Run Code Online (Sandbox Code Playgroud) 我需要通过打开浏览器窗口来调试由另一个Java应用程序(webstart)启动的applet.它适用于旧版本的java,但是对于Java 1.7_45,调试仅适用于第一个JVM(即webstart应用程序).
我在jcontrol中使用这些参数:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8086
Run Code Online (Sandbox Code Playgroud)
我认为这没有错,因为调试器正确连接.唯一的问题是,我只能调试webstart应用程序而不是之后运行的applet.
在webstart应用程序和applet的控制台中显示:
Java Plug-in 10.45.2.18
Using JRE version
1.7.0_45-b18 Java HotSpot(TM) 64-Bit Server VM
Run Code Online (Sandbox Code Playgroud)
JNLP java进程以agentlib我在jcontrol中设置的选项开始:
/usr/lib/jvm/java-7-oracle/jre/bin/java -Xmx512m -Xms128m
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8086
-Xbootclasspath/a:/usr/lib/jvm/java-7-oracle/jre/lib/javaws.jar:/usr/lib/jvm/java-7-oracle/jre/lib/deploy.jar:/usr/lib/jvm/java-7-oracle/jre/lib/plugin.jar
-classpath /usr/lib/jvm/java-7-oracle/jre/lib/deploy.jar
-Djnlpx.vmargs="-Xmx512m -Xms128m
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8086"
-Djnlpx.jvm=/usr/lib/jvm/java-7-oracle/jre/bin/java
....
Run Code Online (Sandbox Code Playgroud)
当我打开一个applet我想从这个webstart应用程序进行调试时,会打开firefox中的新选项卡并启动三个进程:
/opt/firefox/plugin-container /usr/lib/jvm/java-7-oracle/jre/lib/amd64/libnpjp2.so -greomni /opt/firefox/omni.ja -appomni /opt/firefox/browser/omni.ja -appdir /opt/firefox/browser 13665 true plugin
/usr/lib/jvm/java-7-oracle/jre/bin/java -D__jvm_launched=8315888593 -D__applet_launched=8315738716 -Xbootclasspath/a:/usr/lib/jvm/java-7-oracle/jre/lib/deploy.jar:/usr/lib/jvm/java-7-oracle/jre/lib/javaws.jar:/usr/lib/jvm/java-7-oracle/jre/lib/plugin.jar -Djava.class.path=/usr/lib/jvm/java-7-oracle/jre/classes -Dsun.awt.warmup=true sun.plugin2.main.client.PluginMain write_pipe_name=/tmp/.com.sun.deploy.net.socket.13900.6946726655044877700.AF_UNIX
/usr/lib/jvm/java-7-oracle/jre/bin/java -D__jvm_launched=8317712180 -D__applet_launched=8315738716 -Xbootclasspath/a:/usr/lib/jvm/java-7-oracle/jre/lib/deploy.jar:/usr/lib/jvm/java-7-oracle/jre/lib/javaws.jar:/usr/lib/jvm/java-7-oracle/jre/lib/plugin.jar -Djava.class.path=/usr/lib/jvm/java-7-oracle/jre/classes -Djnlpx.session.data=/tmp/session6916520025949955515 -Dsun.awt.warmup=true sun.plugin2.main.client.PluginMain write_pipe_name=/tmp/.com.sun.deploy.net.socket.13900.3102318208570708149.AF_UNIX
Run Code Online (Sandbox Code Playgroud)
如您所见,调试端口不作为参数传递给执行applet的命令
我试图向applet标签添加新的调试参数(我已尝试过Xdebug和agentlib),但它什么也没做:
<param name="java_arguments" value="-Djnlp.packEnabled=true -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8087">
Run Code Online (Sandbox Code Playgroud)
我也试过使用appletviewer,在解决了pack200库的问题之后,我坚持这个例外:
java.lang.NoClassDefFoundError: netscape/javascript/JSException
at java.lang.Class.getDeclaredConstructors0(Native Method)
Run Code Online (Sandbox Code Playgroud)
但我不认为这是一个解决方案,因为appletviewer不能与pack200一起工作,我必须将重复的库添加到服务器.
是否有可能:
我从应用程序中获得了一个堆转储,并发现有大量的ArrayLists,其中只有一个对象.我知道如何获取这些arraylists的列表,并显示包含元素的类:
SELECT list.elementData[0] FROM java.util.ArrayList list WHERE (list.size = 1)
Run Code Online (Sandbox Code Playgroud)
结果如下:
java.lang.String [id=0x7f8e44970]
java.lang.String [id=0x7f8e44980]
java.lang.String [id=0x7f8e44572]
java.io.File [id=0x7f8e43572]
...
Run Code Online (Sandbox Code Playgroud)
我想要的是得到这样的东西:
Class | count
=================================
java.lang.String | 100
java.io.File | 74
...
Run Code Online (Sandbox Code Playgroud)
但我无法汇总结果或对其进行任何其他操作.我在这里找到了如何将值传递给外部选择,但我无法弄清楚如何*在第一个选择旁边使用其他任何东西.
SELECT * from OBJECTS
(SELECT OBJECTS list.elementData[0] FROM java.util.ArrayList list WHERE (list.size = 1))
Run Code Online (Sandbox Code Playgroud)