Java 在露天。如何创建用于测试的临时文件?

Java 在露天。如何创建用于测试的临时文件?,java,junit,transactions,alfresco,Java,Junit,Transactions,Alfresco,我的想法是在测试中创建一个文件,然后删除它,但我的代码失败了 我的代码: @RunWith(RemoteTestRunner.class) @Remote(runnerClass=SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:alfresco/application-context.xml") public class FooTest { private static final String ADM

我的想法是在测试中创建一个文件,然后删除它,但我的代码失败了

我的代码:

 @RunWith(RemoteTestRunner.class)
 @Remote(runnerClass=SpringJUnit4ClassRunner.class)
 @ContextConfiguration("classpath:alfresco/application-context.xml")
 public class FooTest {
   private static final String ADMIN_USER_NAME = "admin";

   @Autowired
   @Qualifier("NodeService")
   protected NodeService nodeService;

   @Autowired
   private FileFolderService fileFolderService;

   @Autowired
   protected Repository repositoryHelper;

   @Test
   public void testCreateTempFile() {
     AuthenticationUtil.setFullyAuthenticatedUser(ADMIN_USER_NAME);

     NodeRef root = repositoryHelper.getSharedHome();

     // create the node
     // this line throw an exception
     FileInfo fileInfo = fileFolderService.create(root,
       "foo.txt", ContentModel.PROP_CONTENT);
     ...
   }
 }
出现以下错误:

org.alfresco.error.AlfrescoRuntimeException:07170002交易必须 处于活动状态并且需要同步:线程[main,5,main]位于 org.alfresco.util.transaction.TransactionSupportUtil.registerSynchronizations(TransactionSupportUtil.java:188)


交易是如何运作的?如何激活它?

您是否尝试过
@Transactional
注释

@Test
@Transactional
public void testCreateTempFile() {
....

这将解决您的问题。

为了使用临时文件,alfresco提供了一个实用程序类

org.alfresco.util.TempFileProvider

它拥有所有允许您创建临时文件和目录的API

如果你对临时文件有着广泛的使用,你甚至可以考虑使用它来允许在规则的时间间隔内清除临时文件。

< P>我找到了解决方案:

RetryingTransactionHelper transactionHelper = transactionService.getRetryingTransactionHelper();
final String filename =  "TestSite" + System.currentTimeMillis();

NodeRef noderef = transactionHelper.doInTransaction(new RetryingTransactionCallback<NodeRef>() {
    public NodeRef execute() throws Throwable {
      final NodeRef parent = repositoryHelper.getCompanyHome();
      FileInfo fileInfo = fileFolderService.create(parent, filename, ContentModel.PROP_CONTENT);
      NodeRef node = fileInfo.getNodeRef();

      ContentWriter writer = contentService.getWriter(node, ContentModel.PROP_CONTENT, true);
      writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN);
      writer.setEncoding("UTF-8");
      writer.putContent(content);
      return node;
    }
});
RetryingTransactionHelper transactionHelper=transactionService.getRetryingTransactionHelper();
最终字符串filename=“TestSite”+System.currentTimeMillis();
NodeRef NodeRef=transactionHelper.doInTransaction(新建重试TransactionCallback()){
public NodeRef execute()抛出可丢弃的{
final NodeRef parent=repositoryHelper.getCompanyHome();
FileInfo FileInfo=fileFolderService.create(父级、文件名、ContentModel.PROP_CONTENT);
NodeRef node=fileInfo.getNodeRef();
ContentWriter=contentService.getWriter(节点,ContentModel.PROP\u CONTENT,true);
writer.setMimetype(MimetypeMap.MIMETYPE\u TEXT\u PLAIN);
writer.setEncoding(“UTF-8”);
作者:内容(content);
返回节点;
}
});

在Junit中,必须使用事务来创建文件。

Yup,您也可以使用@Transactional注释(代码行更少)。我就是这样做的,是一样的吗?我明天会试试,如果一样的话,我会给你答案,不用给我答案。但是,是的,我在测试用例中使用了Spring transactionnal注释。我把它取下来检查,并且有和你一样的stacktrace。