// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= DevFaqTestUsingSystemFileSystem
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki DevFaqTestUsingSystemFileSystem
:description: Apache NetBeans wiki DevFaqTestUsingSystemFileSystem
:toc: left
:toc-title:
:syntax: true

== How do I test something which uses the System Filesystem?

There is a fake System FileSystem provided by as soon as FileSystem link:API.asciidoc[API] is on classpath. It understands link:NetBeans.asciidoc[NetBeans] layer definitions and is generally suitable for running unit tests.

In case you see difference from expected behavior:

* Try to run tests in link:DevFaqUsingSimpletests.asciidoc[real mode]
* Report link:NetBeans.asciidoc[NetBeans] a bug (product platform/filesystems) with a test case

== Apache Migration Information

The content in this page was kindly donated by Oracle Corp. to the
Apache Software Foundation.

This page was exported from link:http://wiki.netbeans.org/DevFaqTestUsingSystemFileSystem[http://wiki.netbeans.org/DevFaqTestUsingSystemFileSystem] , 
that was last modified by NetBeans user Jtulach 
on 2009-12-08T11:51:31Z.


*NOTE:* This document was automatically converted to the AsciiDoc format on 2018-02-07, and needs to be reviewed.
